Merge branch '1.0.x' of git://gitorious.org/statusnet/mainline
Conflicts: plugins/OStatus/actions/ostatusinit.php
This commit is contained in:
commit
31b29fde50
285
EVENTS.txt
285
EVENTS.txt
@ -1089,13 +1089,13 @@ EndGroupSave: After saving a group, aliases, and first member
|
|||||||
- $group: group that was saved
|
- $group: group that was saved
|
||||||
|
|
||||||
StartInterpretCommand: Before running a command
|
StartInterpretCommand: Before running a command
|
||||||
- $cmd: First word in the string, 'foo' in 'foo argument'
|
- $cmd: First word in the string, 'foo' in 'foo argument'
|
||||||
- $arg: Argument, if any, like 'argument' in 'foo argument'
|
- $arg: Argument, if any, like 'argument' in 'foo argument'
|
||||||
- $user: User who issued the command
|
- $user: User who issued the command
|
||||||
- &$result: Resulting command; you can set this!
|
- &$result: Resulting command; you can set this!
|
||||||
|
|
||||||
EndInterpretCommand: Before running a command
|
EndInterpretCommand: Before running a command
|
||||||
- $cmd: First word in the string, 'foo' in 'foo argument'
|
- $cmd: First word in the string, 'foo' in 'foo argument'
|
||||||
- $arg: Argument, if any, like 'argument' in 'foo argument'
|
- $arg: Argument, if any, like 'argument' in 'foo argument'
|
||||||
- $user: User who issued the command
|
- $user: User who issued the command
|
||||||
- $result: Resulting command
|
- $result: Resulting command
|
||||||
@ -1111,11 +1111,161 @@ EndGroupActionsList: End the list of actions on a group profile page (before </u
|
|||||||
StartGroupProfileElements: Start showing stuff about the group on its profile page
|
StartGroupProfileElements: Start showing stuff about the group on its profile page
|
||||||
- $action: action being executed (for output and params)
|
- $action: action being executed (for output and params)
|
||||||
- $group: group for the page
|
- $group: group for the page
|
||||||
|
|
||||||
EndGroupProfileElements: Start showing stuff about the group on its profile page
|
EndGroupProfileElements: Start showing stuff about the group on its profile page
|
||||||
- $action: action being executed (for output and params)
|
- $action: action being executed (for output and params)
|
||||||
- $group: group for the page
|
- $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)
|
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
|
- $obj: ActivityObject
|
||||||
- $out: XMLOutputter to append custom output
|
- $out: XMLOutputter to append custom output
|
||||||
@ -1139,3 +1289,132 @@ StartNoticeWhoGets: Called at start of inbox delivery prep; plugins can schedule
|
|||||||
EndNoticeWhoGets: Called at end of inbox delivery prep; plugins can filter out profiles from receiving inbox delivery here. Be aware that output can be cached or used several times, so should remain idempotent.
|
EndNoticeWhoGets: Called at end of inbox delivery prep; plugins can filter out profiles from receiving inbox delivery here. Be aware that output can be cached or used several times, so should remain idempotent.
|
||||||
- $notice Notice
|
- $notice Notice
|
||||||
- &$ni: in/out array mapping profile IDs to constants: NOTICE_INBOX_SOURCE_SUB etc
|
- &$ni: in/out array mapping profile IDs to constants: NOTICE_INBOX_SOURCE_SUB etc
|
||||||
|
|
||||||
|
StartDefaultLocalNav: When showing the default local nav
|
||||||
|
- $menu: the menu
|
||||||
|
- $user: current user
|
||||||
|
|
||||||
|
EndDefaultLocalNav: When showing the default local nav
|
||||||
|
- $menu: the menu
|
||||||
|
- $user: current user
|
||||||
|
|
||||||
|
StartShowAccountProfileBlock: When showing the profile block for an account
|
||||||
|
- $out: XMLOutputter to append custom output
|
||||||
|
- $profile: the profile being shown
|
||||||
|
|
||||||
|
EndShowAccountProfileBlock: After showing the profile block for an account
|
||||||
|
- $out: XMLOutputter to append custom output
|
||||||
|
- $profile: the profile being shown
|
||||||
|
|
||||||
|
StartShowGroupProfileBlock: When showing the profile block for a group
|
||||||
|
- $out: XMLOutputter to append custom output
|
||||||
|
- $profile: the profile being shown
|
||||||
|
|
||||||
|
EndShowGroupProfileBlock: After showing the profile block for a group
|
||||||
|
- $out: XMLOutputter to append custom output
|
||||||
|
- $group: the group being shown
|
||||||
|
|
||||||
|
StartShowThreadedNoticeTail: when showing the replies etc. to a notice
|
||||||
|
- $nli: parent noticelistitem
|
||||||
|
- $notice: parent notice
|
||||||
|
- &$children: list of children
|
||||||
|
|
||||||
|
EndShowThreadedNoticeTail: when showing the replies etc. to a notice
|
||||||
|
- $nli: parent noticelistitem
|
||||||
|
- $notice: parent notice
|
||||||
|
- $children: list of children
|
||||||
|
|
||||||
|
StartShowThreadedNoticeSub: when showing a reply to a notice
|
||||||
|
- $nli: parent noticelistitem
|
||||||
|
- $parent: parent notice
|
||||||
|
- $child: child notice
|
||||||
|
|
||||||
|
EndShowThreadedNoticeSub: when showing a reply to a notice
|
||||||
|
- $nli: parent noticelistitem
|
||||||
|
- $parent: parent notice
|
||||||
|
- $child: child notice
|
||||||
|
|
||||||
|
StartAddEmailAddress: when adding an email address through the Web UI
|
||||||
|
- $user: user getting the new address
|
||||||
|
- $email: email being added
|
||||||
|
|
||||||
|
EndAddEmailAddress: done adding an email address through the Web UI
|
||||||
|
- $user: user getting the new address
|
||||||
|
- $email: email being added
|
||||||
|
|
||||||
|
StartValidateEmailInvite: when validating an email address for invitations
|
||||||
|
- $user: user doing the invite
|
||||||
|
- $email: email address
|
||||||
|
- &$valid: flag for if it's valid; can be modified
|
||||||
|
|
||||||
|
EndValidateEmailInvite: after validating an email address for invitations
|
||||||
|
- $user: user doing the invite
|
||||||
|
- $email: email address
|
||||||
|
- &$valid: flag for if it's valid; can be modified
|
||||||
|
|
||||||
|
StartLocalURL: before resolving a local url for an action
|
||||||
|
- &$action: action to find a path for
|
||||||
|
- &$paramsi: parameters to pass to the action
|
||||||
|
- &$fragment: any url fragement
|
||||||
|
- &$addSession: whether to add session variable
|
||||||
|
- &$url: resulting URL to local resource
|
||||||
|
|
||||||
|
EndLocalURL: before resolving a local url for an action
|
||||||
|
- &$action: action to find a path for
|
||||||
|
- &$paramsi: parameters to pass to the action
|
||||||
|
- &$fragment: any url fragement
|
||||||
|
- &$addSession: whether to add session variable
|
||||||
|
- &$url: resulting URL to local resource
|
||||||
|
|
||||||
|
StartProfileGetAvatar: When getting an avatar for a profile
|
||||||
|
- $profile: profile
|
||||||
|
- $size: size of the avatar
|
||||||
|
- &$avatar: avatar
|
||||||
|
|
||||||
|
EndProfileGetAvatar: After getting an avatar for a profile
|
||||||
|
- $profile: profile
|
||||||
|
- $size: size of the avatar
|
||||||
|
- &$avatar: avatar
|
||||||
|
|
||||||
|
StartRegisterSuccess: Before showing the registration success message
|
||||||
|
- $action: the registration action
|
||||||
|
|
||||||
|
StartRegisterSuccess: After showing the registration success message
|
||||||
|
- $action: the registration action
|
||||||
|
|
||||||
|
StartDocFileForTitle: Before searching for a doc or mail template
|
||||||
|
- $title: Title we're looking for
|
||||||
|
- &$paths: Paths we're searching
|
||||||
|
- &$filename: Filename so far (set this if you want)
|
||||||
|
|
||||||
|
EndDocFileForTitle: After searching for a doc or mail template
|
||||||
|
- $title: Title we looked for
|
||||||
|
- $paths: Paths we searched
|
||||||
|
- &$filename: Filename so far (set this if you want)
|
||||||
|
|
||||||
|
StartReadWriteTables: when noting which tables must be read-write, even on read-only actions
|
||||||
|
- &$tables: list of table names
|
||||||
|
- &$rwdb: read-write database URI
|
||||||
|
|
||||||
|
EndReadWriteTables: after noting which tables must be read-write, even on read-only actions
|
||||||
|
- $tables: list of table names
|
||||||
|
- $rwdb: read-write database URI
|
||||||
|
|
||||||
|
StartShowInviteForm: Right before displaying the invitations form
|
||||||
|
- $action: invitation action
|
||||||
|
|
||||||
|
EndShowInviteForm: After displaying the invitations form
|
||||||
|
- $action: invitation action
|
||||||
|
|
||||||
|
StartSendInvitations: Right before sending invitations
|
||||||
|
- $action: invitation action
|
||||||
|
|
||||||
|
EndSendInvitations: Right after sending invitations
|
||||||
|
- $action: invitation action
|
||||||
|
|
||||||
|
StartShowInvitationSuccess: Right before showing invitations success msg
|
||||||
|
- $action: invitation action
|
||||||
|
|
||||||
|
EndShowInvitationSuccess: After showing invitations success msg
|
||||||
|
- $action: invitation action
|
||||||
|
|
||||||
|
116
README
116
README
@ -2,8 +2,8 @@
|
|||||||
README
|
README
|
||||||
------
|
------
|
||||||
|
|
||||||
StatusNet 0.9.6 "Man on the Moon"
|
StatusNet 0.9.7 "World Leader Pretend"
|
||||||
29 October 2010
|
17 March 2011
|
||||||
|
|
||||||
This is the README file for StatusNet, the Open Source microblogging
|
This is the README file for StatusNet, the Open Source microblogging
|
||||||
platform. It includes installation instructions, descriptions of
|
platform. It includes installation instructions, descriptions of
|
||||||
@ -96,43 +96,47 @@ for additional terms.
|
|||||||
New this version
|
New this version
|
||||||
================
|
================
|
||||||
|
|
||||||
This is a security, bug and feature release since version 0.9.5 released on
|
This is a security, bug and feature release since version 0.9.6 released on
|
||||||
10 September 2010.
|
23 October 2010.
|
||||||
|
|
||||||
For best compatibility with client software and site federation, and a lot of
|
For best compatibility with client software and site federation, and a
|
||||||
bug fixes, it is highly recommended that all public sites upgrade to the new
|
lot of bug fixes, it is highly recommended that all public sites
|
||||||
version.
|
upgrade to the new version. Upgrades require new database indexes for
|
||||||
|
best performance; see Upgrade below.
|
||||||
|
|
||||||
Notable changes this version:
|
Notable changes this version:
|
||||||
|
|
||||||
- Site moderators can now delete groups.
|
- GroupPrivateMessage plugin lets users send private messages
|
||||||
- New themes: clean, shiny, mnml, victorian
|
to a group. (Similar to "private groups" on Yammer.)
|
||||||
- New YammerImport plugin allows site admins to import non-private profiles and
|
- Support for Twitter streaming API in Twitter bridge plugin
|
||||||
message from an authenticated Yammer site.
|
- Support for a new Activity Streams-based API using AtomPub, allowing
|
||||||
- New experimental plugins: AnonFavorites, SlicedFavorites, GroupFavorited,
|
richer API data. See http://status.net/wiki/AtomPub for details.
|
||||||
ForceGroup, ShareNotice
|
- Unified Facebook plugin, replacing previous Facebook application
|
||||||
- OAuth upgraded to 1.0a
|
and Facebook Connect plugin.
|
||||||
- Localization updates now include plugins, thanks to translatewiki.net!
|
- A plugin to send out a daily summary email to network users.
|
||||||
- SSL link generation should be more consistent; alternate SSL URLs can be
|
- In-line thumbnails of some attachments (video, images) and oEmbed objects.
|
||||||
set in the admin UI for more parts of the system.
|
- Local copies of remote profiles to let moderators manage OStatus users.
|
||||||
- Experimental backupuser.php, restoreuser.php command-line scripts to
|
- Upgrade upstream JS, minify everything.
|
||||||
dump/restore a user's complete activity stream. Can be used to transfer
|
- Allow pushing plugin JS, CSS, and static files to a CDN.
|
||||||
accounts manually between sites, or to save a backup before deleting.
|
- Configurable nickname rules.
|
||||||
- Unicode fixes for OStatus notices
|
- Better support for bit.ly URL shortener.
|
||||||
- Header metadata on notice pages to aid in manual reposting on Facebook
|
- InProcessCache plugin for additional caching on top of memcached.
|
||||||
- Lots of little fixes...
|
- Support for Activity Streams JSON feeds on many streams.
|
||||||
|
- User-initiated backup and restore of account data in Activity Streams
|
||||||
|
format.
|
||||||
|
- Bookmark plugin for making del.icio.us-like social bookmarking sites,
|
||||||
|
including del.icio.us backup file import. Supports OStatus.
|
||||||
|
- SQLProfile plugin to tune SQL queries.
|
||||||
|
- Better sorting on timelines to support restored or imported data.
|
||||||
|
- Hundreds of translations from http://translatewiki.net/
|
||||||
|
- Hundreds of performance tunings, bug fixes, and UI improvements.
|
||||||
|
- Remove deprecated data from Activity Streams Atom output, to the
|
||||||
|
extent possible.
|
||||||
|
- NewMenu plugin for new layout of menu items.
|
||||||
|
- Experimental support for moving an account from one server to
|
||||||
|
another, using new AtomPub API.
|
||||||
|
|
||||||
Changes from 0.9.6 release candidate 1:
|
A full changelog is available at http://status.net/wiki/StatusNet_0.9.7.
|
||||||
- fix for broken group pages when logged out
|
|
||||||
- fix for stuck ping queue entries when bad profile
|
|
||||||
- fix for bogus single-user nickname config entry error
|
|
||||||
- i18n updates
|
|
||||||
- nofollow updates
|
|
||||||
- SSL-only mode secure cookie fix
|
|
||||||
- experimental ApiLogger plugin for usage data gathering
|
|
||||||
- experimental follow-everyone plugin
|
|
||||||
|
|
||||||
A full changelog is available at http://status.net/wiki/StatusNet_0.9.6.
|
|
||||||
|
|
||||||
Prerequisites
|
Prerequisites
|
||||||
=============
|
=============
|
||||||
@ -243,9 +247,9 @@ especially if you've previously installed PHP/MySQL packages.
|
|||||||
1. Unpack the tarball you downloaded on your Web server. Usually a
|
1. Unpack the tarball you downloaded on your Web server. Usually a
|
||||||
command like this will work:
|
command like this will work:
|
||||||
|
|
||||||
tar zxf statusnet-0.9.6.tar.gz
|
tar zxf statusnet-0.9.7.tar.gz
|
||||||
|
|
||||||
...which will make a statusnet-0.9.6 subdirectory in your current
|
...which will make a statusnet-0.9.7 subdirectory in your current
|
||||||
directory. (If you don't have shell access on your Web server, you
|
directory. (If you don't have shell access on your Web server, you
|
||||||
may have to unpack the tarball on your local computer and FTP the
|
may have to unpack the tarball on your local computer and FTP the
|
||||||
files to the server.)
|
files to the server.)
|
||||||
@ -253,7 +257,7 @@ especially if you've previously installed PHP/MySQL packages.
|
|||||||
2. Move the tarball to a directory of your choosing in your Web root
|
2. Move the tarball to a directory of your choosing in your Web root
|
||||||
directory. Usually something like this will work:
|
directory. Usually something like this will work:
|
||||||
|
|
||||||
mv statusnet-0.9.6 /var/www/statusnet
|
mv statusnet-0.9.7 /var/www/statusnet
|
||||||
|
|
||||||
This will make your StatusNet instance available in the statusnet path of
|
This will make your StatusNet instance available in the statusnet path of
|
||||||
your server, like "http://example.net/statusnet". "microblog" or
|
your server, like "http://example.net/statusnet". "microblog" or
|
||||||
@ -668,7 +672,7 @@ with this situation.
|
|||||||
If you've been using StatusNet 0.7, 0.6, 0.5 or lower, or if you've
|
If you've been using StatusNet 0.7, 0.6, 0.5 or lower, or if you've
|
||||||
been tracking the "git" version of the software, you will probably
|
been tracking the "git" version of the software, you will probably
|
||||||
want to upgrade and keep your existing data. There is no automated
|
want to upgrade and keep your existing data. There is no automated
|
||||||
upgrade procedure in StatusNet 0.9.6. Try these step-by-step
|
upgrade procedure in StatusNet 0.9.7. Try these step-by-step
|
||||||
instructions; read to the end first before trying them.
|
instructions; read to the end first before trying them.
|
||||||
|
|
||||||
0. Download StatusNet and set up all the prerequisites as if you were
|
0. Download StatusNet and set up all the prerequisites as if you were
|
||||||
@ -689,25 +693,30 @@ instructions; read to the end first before trying them.
|
|||||||
5. Once all writing processes to your site are turned off, make a
|
5. Once all writing processes to your site are turned off, make a
|
||||||
final backup of the Web directory and database.
|
final backup of the Web directory and database.
|
||||||
6. Move your StatusNet directory to a backup spot, like "statusnet.bak".
|
6. Move your StatusNet directory to a backup spot, like "statusnet.bak".
|
||||||
7. Unpack your StatusNet 0.9.6 tarball and move it to "statusnet" or
|
7. Unpack your StatusNet 0.9.7 tarball and move it to "statusnet" or
|
||||||
wherever your code used to be.
|
wherever your code used to be.
|
||||||
8. Copy the config.php file and the contents of the avatar/, background/,
|
8. Copy the config.php file and the contents of the avatar/, background/,
|
||||||
file/, and local/ subdirectories from your old directory to your new
|
file/, and local/ subdirectories from your old directory to your new
|
||||||
directory.
|
directory.
|
||||||
9. Copy htaccess.sample to .htaccess in the new directory. Change the
|
9. Copy htaccess.sample to .htaccess in the new directory. Change the
|
||||||
RewriteBase to use the correct path.
|
RewriteBase to use the correct path.
|
||||||
10. Rebuild the database. (You can safely skip this step and go to #12
|
10. Rebuild the database.
|
||||||
if you're upgrading from another 0.9.x version).
|
|
||||||
|
|
||||||
NOTE: this step is destructive and cannot be
|
NOTE: this step is destructive and cannot be
|
||||||
reversed. YOU CAN EASILY DESTROY YOUR SITE WITH THIS STEP. Don't
|
reversed. YOU CAN EASILY DESTROY YOUR SITE WITH THIS STEP. Don't
|
||||||
do it without a known-good backup!
|
do it without a known-good backup!
|
||||||
|
|
||||||
If your database is at version 0.8.0 or above, you can run a
|
If your database is at version 0.8.0 or higher in the 0.8.x line, you can run a
|
||||||
special upgrade script:
|
special upgrade script:
|
||||||
|
|
||||||
mysql -u<rootuser> -p<rootpassword> <database> db/08to09.sql
|
mysql -u<rootuser> -p<rootpassword> <database> db/08to09.sql
|
||||||
|
|
||||||
|
If you are upgrading from any 0.9.x version like 0.9.6, run this script:
|
||||||
|
|
||||||
|
mysql -u<rootuser> -p<rootpassword> <database> db/096to097.sql
|
||||||
|
|
||||||
|
Despite the name, it should work for any 0.9.x branch.
|
||||||
|
|
||||||
Otherwise, go to your StatusNet directory and AFTER YOU MAKE A
|
Otherwise, go to your StatusNet directory and AFTER YOU MAKE A
|
||||||
BACKUP run the rebuilddb.sh script like this:
|
BACKUP run the rebuilddb.sh script like this:
|
||||||
|
|
||||||
@ -1143,6 +1152,9 @@ ssl: Whether to use SSL for JavaScript files. Default is null, which means
|
|||||||
sslserver: SSL server to use when page is HTTPS-encrypted. If
|
sslserver: SSL server to use when page is HTTPS-encrypted. If
|
||||||
unspecified, site ssl server and so on will be used.
|
unspecified, site ssl server and so on will be used.
|
||||||
sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted.
|
sslpath: If sslserver if defined, path to use when page is HTTPS-encrypted.
|
||||||
|
bustframes: If true, all web pages will break out of framesets. If false,
|
||||||
|
can comfortably live in a frame or iframe... probably. Default
|
||||||
|
to true.
|
||||||
|
|
||||||
xmpp
|
xmpp
|
||||||
----
|
----
|
||||||
@ -1392,13 +1404,25 @@ maxaliases: maximum number of aliases a group can have. Default 3. Set
|
|||||||
desclimit: maximum number of characters to allow in group descriptions.
|
desclimit: maximum number of characters to allow in group descriptions.
|
||||||
null (default) means to use the site-wide text limits. 0
|
null (default) means to use the site-wide text limits. 0
|
||||||
means no limit.
|
means no limit.
|
||||||
|
addtag: Whether to add a tag for the group nickname for every group post
|
||||||
|
(pre-1.0.x behaviour). Defaults to false.
|
||||||
|
|
||||||
oohembed
|
oembed
|
||||||
--------
|
--------
|
||||||
|
|
||||||
oEmbed endpoint for multimedia attachments (links in posts).
|
oEmbed endpoint for multimedia attachments (links in posts). Will also
|
||||||
|
work as 'oohembed' for backwards compatibility.
|
||||||
|
|
||||||
endpoint: oohembed endpoint using http://oohembed.com/ software.
|
endpoint: oohembed endpoint using http://oohembed.com/ software. Defaults to
|
||||||
|
'http://oohembed.com/oohembed/'.
|
||||||
|
order: Array of methods to check for OEmbed data. Methods include 'built-in'
|
||||||
|
(use a built-in function to simulate oEmbed for some sites),
|
||||||
|
'well-known' (use well-known public oEmbed endpoints),
|
||||||
|
'discovery' (discover using <link> headers in HTML), 'service' (use
|
||||||
|
a third-party service, like oohembed or embed.ly. Default is
|
||||||
|
array('built-in', 'well-known', 'service', 'discovery'). Note that very
|
||||||
|
few sites implement oEmbed; 'discovery' is going to fail 99% of the
|
||||||
|
time.
|
||||||
|
|
||||||
search
|
search
|
||||||
------
|
------
|
||||||
@ -1472,6 +1496,8 @@ Configuration options specific to notices.
|
|||||||
contentlimit: max length of the plain-text content of a notice.
|
contentlimit: max length of the plain-text content of a notice.
|
||||||
Default is null, meaning to use the site-wide text limit.
|
Default is null, meaning to use the site-wide text limit.
|
||||||
0 means no limit.
|
0 means no limit.
|
||||||
|
defaultscope: default scope for notices. Defaults to 0; set to
|
||||||
|
1 to keep notices private to this site by default.
|
||||||
|
|
||||||
message
|
message
|
||||||
-------
|
-------
|
||||||
|
178
actions/addpeopletag.php
Normal file
178
actions/addpeopletag.php
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
<?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()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
|
$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)) {
|
||||||
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in 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)) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing profile.
|
||||||
|
$this->clientError(_('No such profile.'));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = $this->arg('peopletag_id');
|
||||||
|
$this->peopletag = Profile_list::staticGet('id', $id);
|
||||||
|
|
||||||
|
if (empty($this->peopletag)) {
|
||||||
|
// TRANS: Client error displayed trying to reference a non-existing list.
|
||||||
|
$this->clientError(_('No such list.'));
|
||||||
|
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)) {
|
||||||
|
// TRANS: Client error displayed when trying to add an OMB 0.1 remote profile to a list.
|
||||||
|
$this->clientError(_('You cannot list 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(
|
||||||
|
// TRANS: Client error displayed when an unknown error occurs when adding a user to a list.
|
||||||
|
// TRANS: %s is a username.
|
||||||
|
sprintf(_('There was an unexpected error while listing %s.'),
|
||||||
|
$user->nickname));
|
||||||
|
} else {
|
||||||
|
// TRANS: Client error displayed when an unknown error occurs when adding a user to a list.
|
||||||
|
// TRANS: %s is a profile URL.
|
||||||
|
$this->clientError(sprintf(_('There was a problem listing %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');
|
||||||
|
// TRANS: Title after adding a user to a list.
|
||||||
|
$this->element('title', null, _m('TITLE','Listed'));
|
||||||
|
$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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -55,17 +55,15 @@ class AllAction extends ProfileAction
|
|||||||
function prepare($args)
|
function prepare($args)
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
$cur = common_current_user();
|
|
||||||
|
|
||||||
if (!empty($cur) && $cur->id == $this->user->id) {
|
$stream = new ThreadingInboxNoticeStream($this->user, Profile::current());
|
||||||
$this->notice = $this->user->noticeInboxThreaded(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
|
|
||||||
} else {
|
$this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE,
|
||||||
$this->notice = $this->user->noticesWithFriendsThreaded(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
|
NOTICES_PER_PAGE + 1);
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->page > 1 && $this->notice->N == 0) {
|
if ($this->page > 1 && $this->notice->N == 0) {
|
||||||
// TRANS: Server error when page not found (404).
|
// TRANS: Server error when page not found (404).
|
||||||
$this->serverError(_('No such page.'), $code = 404);
|
$this->serverError(_('No such page.'), 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -86,12 +84,15 @@ class AllAction extends ProfileAction
|
|||||||
|
|
||||||
function title()
|
function title()
|
||||||
{
|
{
|
||||||
if ($this->page > 1) {
|
$user = common_current_user();
|
||||||
// TRANS: Page title. %1$s is user nickname, %2$d is page number
|
if ($user->id == $this->user->id) {
|
||||||
return sprintf(_('%1$s and friends, page %2$d'), $this->user->nickname, $this->page);
|
// TRANS: Title of a user's own start page.
|
||||||
|
return _('Home timeline');
|
||||||
} else {
|
} else {
|
||||||
// TRANS: Page title. %s is user nickname
|
$profile = $this->user->getProfile();
|
||||||
return sprintf(_("%s and friends"), $this->user->nickname);
|
// TRANS: Title of another user's start page.
|
||||||
|
// TRANS: %s is the other user's name.
|
||||||
|
return sprintf(_("%s's home timeline"), $profile->getBestName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +158,16 @@ class AllAction extends ProfileAction
|
|||||||
function showContent()
|
function showContent()
|
||||||
{
|
{
|
||||||
if (Event::handle('StartShowAllContent', array($this))) {
|
if (Event::handle('StartShowAllContent', array($this))) {
|
||||||
$nl = new ThreadedNoticeList($this->notice, $this);
|
|
||||||
|
$profile = null;
|
||||||
|
|
||||||
|
$current_user = common_current_user();
|
||||||
|
|
||||||
|
if (!empty($current_user)) {
|
||||||
|
$profile = $current_user->getProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
$nl = new ThreadedNoticeList($this->notice, $this, $profile);
|
||||||
|
|
||||||
$cnt = $nl->show();
|
$cnt = $nl->show();
|
||||||
|
|
||||||
@ -174,15 +184,21 @@ class AllAction extends ProfileAction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showPageTitle()
|
function showSections()
|
||||||
{
|
{
|
||||||
$user = common_current_user();
|
$ibs = new InviteButtonSection($this);
|
||||||
if ($user && ($user->id == $this->user->id)) {
|
$ibs->show();
|
||||||
// TRANS: H1 text for page when viewing a list for self.
|
$pop = new PopularNoticeSection($this);
|
||||||
$this->element('h1', null, _("You and friends"));
|
$pop->show();
|
||||||
} else {
|
// $pop = new InboxTagCloudSection($this, $this->user);
|
||||||
// TRANS: H1 text for page. %s is a user nickname.
|
// $pop->show();
|
||||||
$this->element('h1', null, sprintf(_('%s and friends'), $this->user->nickname));
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ThreadingInboxNoticeStream extends ThreadingNoticeStream
|
||||||
|
{
|
||||||
|
function __construct($user, $profile)
|
||||||
|
{
|
||||||
|
parent::__construct(new InboxNoticeStream($user, $profile));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,16 +83,9 @@ class AllrssAction extends Rss10Action
|
|||||||
*/
|
*/
|
||||||
function getNotices($limit=0)
|
function getNotices($limit=0)
|
||||||
{
|
{
|
||||||
$cur = common_current_user();
|
$stream = new InboxNoticeStream($this->user);
|
||||||
$user = $this->user;
|
$notice = $stream->getNotices(0, $limit, null, null);
|
||||||
|
|
||||||
if (!empty($cur) && $cur->id == $user->id) {
|
|
||||||
$notice = $this->user->noticeInbox(0, $limit);
|
|
||||||
} else {
|
|
||||||
$notice = $this->user->noticesWithFriends(0, $limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
$notice = $user->noticesWithFriends(0, $limit);
|
|
||||||
$notices = array();
|
$notices = array();
|
||||||
|
|
||||||
while ($notice->fetch()) {
|
while ($notice->fetch()) {
|
||||||
|
@ -66,6 +66,7 @@ class ApiAccountRateLimitStatusAction extends ApiBareAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -88,7 +88,7 @@ class ApiAccountUpdateDeliveryDeviceAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed handling a non-existing API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -90,7 +90,7 @@ class ApiAccountUpdateProfileAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
@ -107,7 +107,7 @@ class ApiAccountUpdateProfileAction extends ApiAuthAction
|
|||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (empty($profile)) {
|
if (empty($profile)) {
|
||||||
// TRANS: Client error displayed if a user profile could not be found.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->clientError(_('User has no profile.'));
|
$this->clientError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ class ApiAccountUpdateProfileBackgroundImageAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
@ -195,7 +195,7 @@ class ApiAccountUpdateProfileBackgroundImageAction extends ApiAuthAction
|
|||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (empty($profile)) {
|
if (empty($profile)) {
|
||||||
// TRANS: Client error displayed when a user has no profile.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->clientError(_('User has no profile.'));
|
$this->clientError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ class ApiAccountUpdateProfileColorsAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method updating profile colours.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
@ -179,7 +179,7 @@ class ApiAccountUpdateProfileColorsAction extends ApiAuthAction
|
|||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (empty($profile)) {
|
if (empty($profile)) {
|
||||||
// TRANS: Client error displayed a user has no profile updating profile colours.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->clientError(_('User has no profile.'));
|
$this->clientError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ class ApiAccountUpdateProfileImageAction extends ApiAuthAction
|
|||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (empty($profile)) {
|
if (empty($profile)) {
|
||||||
// TRANS: Client error displayed if a user profile could not be found updating a profile image.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->clientError(_('User has no profile.'));
|
$this->clientError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ class ApiAccountVerifyCredentialsAction extends ApiAuthAction
|
|||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method verifying user credentials.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ class ApiBlockCreateAction extends ApiAuthAction
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (empty($this->user) || empty($this->other)) {
|
if (empty($this->user) || empty($this->other)) {
|
||||||
// TRANS: Client error displayed when trying to block a non-existing user or a user from another site.
|
// TRANS: Client error displayed when trying to block a non-existing user or a user from another site.
|
||||||
$this->clientError(_('No such user.'), 404, $this->format);
|
$this->clientError(_('No such user.'), 404, $this->format);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,7 @@ class ApiDirectMessageAction extends ApiAuthAction
|
|||||||
$this->showJsonDirectMessages();
|
$this->showJsonDirectMessages();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error given when an API method was not found (404).
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ class ApiFavoriteCreateAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -94,7 +94,7 @@ class ApiFavoriteDestroyAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -95,7 +95,7 @@ class ApiFriendshipsCreateAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -95,7 +95,7 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -120,7 +120,7 @@ class ApiFriendshipsShowAction extends ApiBareAuthAction
|
|||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method showing friendship.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), 404);
|
$this->clientError(_('API method not found.'), 404);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -134,7 +134,7 @@ class ApiGroupCreateAction extends ApiAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error given when an API method was not found (404).
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -111,7 +111,7 @@ class ApiGroupIsMemberAction extends ApiBareAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method showing group membership.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
400,
|
400,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -144,7 +144,7 @@ class ApiGroupJoinAction extends ApiAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method joining a group.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -134,7 +134,7 @@ class ApiGroupLeaveAction extends ApiAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method leaving a group.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -67,6 +67,7 @@ class ApiGroupListAction extends ApiBareAuthAction
|
|||||||
$this->user = $this->getTargetUser(null);
|
$this->user = $this->getTargetUser(null);
|
||||||
|
|
||||||
if (empty($this->user)) {
|
if (empty($this->user)) {
|
||||||
|
// TRANS: Client error displayed when user not found for an action.
|
||||||
$this->clientError(_('No such user.'), 404, $this->format);
|
$this->clientError(_('No such user.'), 404, $this->format);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -130,7 +131,7 @@ class ApiGroupListAction extends ApiBareAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method checking group membership.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -89,7 +89,7 @@ class ApiGroupListAllAction extends ApiPrivateAuthAction
|
|||||||
$taguribase = TagURI::base();
|
$taguribase = TagURI::base();
|
||||||
$id = "tag:$taguribase:Groups";
|
$id = "tag:$taguribase:Groups";
|
||||||
$link = common_local_url('groups');
|
$link = common_local_url('groups');
|
||||||
// TRANS: Message is used as a subtitle when listing the lastest 20 groups. %s is a site name.
|
// TRANS: Message is used as a subtitle when listing the latest 20 groups. %s is a site name.
|
||||||
$subtitle = sprintf(_("groups on %s"), $sitename);
|
$subtitle = sprintf(_("groups on %s"), $sitename);
|
||||||
|
|
||||||
switch($this->format) {
|
switch($this->format) {
|
||||||
@ -116,7 +116,7 @@ class ApiGroupListAllAction extends ApiPrivateAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method listing the latest 20 groups.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -101,7 +101,7 @@ class ApiGroupMembershipAction extends ApiPrivateAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method showing group membership.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -85,6 +85,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction
|
|||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
|
// TRANS: Client error message. POST is a HTTP command. It should not be translated.
|
||||||
_('This method requires a POST.'),
|
_('This method requires a POST.'),
|
||||||
400, $this->format
|
400, $this->format
|
||||||
);
|
);
|
||||||
@ -93,7 +94,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when using an unsupported API format.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
@ -211,7 +212,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction
|
|||||||
$this->showSingleJsonGroup($this->group);
|
$this->showSingleJsonGroup($this->group);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when using an unsupported API format.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), 404, $this->format);
|
$this->clientError(_('API method not found.'), 404, $this->format);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ class ApiGroupShowAction extends ApiPrivateAuthAction
|
|||||||
$this->showSingleJsonGroup($this->group);
|
$this->showSingleJsonGroup($this->group);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method showing a group.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), 404, $this->format);
|
$this->clientError(_('API method not found.'), 404, $this->format);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ class ApiHelpTestAction extends ApiPrivateAuthAction
|
|||||||
$this->endDocument('json');
|
$this->endDocument('json');
|
||||||
} else {
|
} else {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method testing API connectivity.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
270
actions/apilist.php
Normal file
270
actions/apilist.php
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
<?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)) {
|
||||||
|
// TRANS: Client error displayed when referring to a non-existing list.
|
||||||
|
$this->clientError(_('List 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(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('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(
|
||||||
|
// TRANS: Client error displayed when trying to update another user's list.
|
||||||
|
_('You cannot update lists that do not 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(
|
||||||
|
// TRANS: Client error displayed when an unknown error occurs updating a list.
|
||||||
|
_('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(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('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(
|
||||||
|
// TRANS: Client error displayed when trying to delete another user's list.
|
||||||
|
_('You cannot delete lists that do not 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(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('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;
|
||||||
|
}
|
||||||
|
}
|
125
actions/apilistmember.php
Normal file
125
actions/apilistmember.php
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
<?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)) {
|
||||||
|
// TRANS: Client error displayed when referring to a non-existing list.
|
||||||
|
$this->clientError(_('List not found.'), 404, $this->format);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($this->user)) {
|
||||||
|
// TRANS: Client error displayed when referring to a non-existing 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(
|
||||||
|
// TRANS: Client error displayed when referring to a non-list member.
|
||||||
|
_('The specified user is not a member of this list.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = $this->twitterUserArray($this->user->getProfile(), true);
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showTwitterXmlUser($user, 'user', true);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showSingleJsonUser($user);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
179
actions/apilistmembers.php
Normal file
179
actions/apilistmembers.php
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* List/add/remove list members.
|
||||||
|
*
|
||||||
|
* 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/apilistusers.php';
|
||||||
|
|
||||||
|
class ApiListMembersAction extends ApiListUsersAction
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Add a user to a list (tag someone)
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
function handlePost()
|
||||||
|
{
|
||||||
|
if($this->auth_user->id != $this->list->tagger) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when trying to add members to a list without having the right to do so.
|
||||||
|
_('You are not allowed to add members to this list.'),
|
||||||
|
401,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->user === false) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when trying to modify list members without specifying them.
|
||||||
|
_('You must specify a member.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = Profile_tag::setTag($this->auth_user->id,
|
||||||
|
$this->user->id, $this->list->tag);
|
||||||
|
|
||||||
|
if(empty($result)) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when an unknown error occurs viewing list members.
|
||||||
|
_('An error occured.'),
|
||||||
|
500,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showSingleXmlList($this->list);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showSingleJsonList($this->list);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a user from a list (untag someone)
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
function handleDelete()
|
||||||
|
{
|
||||||
|
if($this->auth_user->id != $this->list->tagger) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when trying to remove members from a list without having the right to do so.
|
||||||
|
_('You are not allowed to remove members from this list.'),
|
||||||
|
401,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->user === false) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when trying to modify list members without specifying them.
|
||||||
|
_('You must specify a member.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$args = array('tagger' => $this->auth_user->id,
|
||||||
|
'tagged' => $this->user->id,
|
||||||
|
'tag' => $this->list->tag);
|
||||||
|
$ptag = Profile_tag::pkeyGet($args);
|
||||||
|
|
||||||
|
if(empty($ptag)) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when trying to remove a list member that is not part of a list.
|
||||||
|
_('The user you are trying to remove from the list is not a member.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $ptag->delete();
|
||||||
|
|
||||||
|
if(empty($result)) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when an unknown error occurs viewing list members.
|
||||||
|
_('An error occured.'),
|
||||||
|
500,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showSingleXmlList($this->list);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showSingleJsonList($this->list);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List the members of a list (people tagged)
|
||||||
|
*/
|
||||||
|
function getUsers()
|
||||||
|
{
|
||||||
|
$fn = array($this->list, 'getTagged');
|
||||||
|
list($this->users, $this->next_cursor, $this->prev_cursor) =
|
||||||
|
Profile_list::getAtCursor($fn, array(), $this->cursor, 20);
|
||||||
|
}
|
||||||
|
}
|
134
actions/apilistmemberships.php
Normal file
134
actions/apilistmemberships.php
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Get a list of lists a user belongs to. (people tags for a user)
|
||||||
|
*
|
||||||
|
* 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 API method to list lists a user belongs to.
|
||||||
|
* (people tags for a user)
|
||||||
|
*
|
||||||
|
* @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 ApiListMembershipsAction extends ApiBareAuthAction
|
||||||
|
{
|
||||||
|
var $lists = array();
|
||||||
|
var $cursor = -1;
|
||||||
|
var $next_cursor = 0;
|
||||||
|
var $prev_cursor = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare for running the action
|
||||||
|
* Take arguments for running:s
|
||||||
|
*
|
||||||
|
* @param array $args $_REQUEST args
|
||||||
|
*
|
||||||
|
* @return boolean success flag
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
|
||||||
|
$this->cursor = (int) $this->arg('cursor', -1);
|
||||||
|
$this->user = $this->getTargetUser($this->arg('user'));
|
||||||
|
|
||||||
|
if (empty($this->user)) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing user.
|
||||||
|
$this->clientError(_('No such user.'), 404, $this->format);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->getLists();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the request
|
||||||
|
*
|
||||||
|
* Show the lists
|
||||||
|
*
|
||||||
|
* @param array $args $_REQUEST data (unused)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showXmlLists($this->lists, $this->next_cursor, $this->prev_cursor);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showJsonLists($this->lists, $this->next_cursor, $this->prev_cursor);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if read only.
|
||||||
|
*
|
||||||
|
* MAY override
|
||||||
|
*
|
||||||
|
* @param array $args other arguments
|
||||||
|
*
|
||||||
|
* @return boolean is read only action?
|
||||||
|
*/
|
||||||
|
function isReadOnly($args)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLists()
|
||||||
|
{
|
||||||
|
$profile = $this->user->getProfile();
|
||||||
|
$fn = array($profile, 'getOtherTags');
|
||||||
|
|
||||||
|
# 20 lists
|
||||||
|
list($this->lists, $this->next_cursor, $this->prev_cursor) =
|
||||||
|
Profile_list::getAtCursor($fn, array($this->auth_user), $this->cursor, 20);
|
||||||
|
}
|
||||||
|
}
|
240
actions/apilists.php
Normal file
240
actions/apilists.php
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* List existing lists or create a new 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 ApiListsAction extends ApiBareAuthAction
|
||||||
|
{
|
||||||
|
var $lists = null;
|
||||||
|
var $cursor = 0;
|
||||||
|
var $next_cursor = 0;
|
||||||
|
var $prev_cursor = 0;
|
||||||
|
var $create = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the flags for handling the request. List lists created by user if this
|
||||||
|
* is a GET request, create a new list if it is a POST request.
|
||||||
|
*
|
||||||
|
* Takes parameters:
|
||||||
|
* - user: the user id or nickname
|
||||||
|
* Parameters for POST request
|
||||||
|
* - name: name of the new list (the people tag itself)
|
||||||
|
* - mode: (optional) mode for the new list private/public
|
||||||
|
* - description: (optional) description for the list
|
||||||
|
*
|
||||||
|
* @return boolean success flag
|
||||||
|
*/
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
|
||||||
|
$this->create = ($_SERVER['REQUEST_METHOD'] == 'POST');
|
||||||
|
|
||||||
|
if (!$this->create) {
|
||||||
|
|
||||||
|
$this->user = $this->getTargetUser($this->arg('user'));
|
||||||
|
|
||||||
|
if (empty($this->user)) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing user.
|
||||||
|
$this->clientError(_('No such user.'), 404, $this->format);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->getLists();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* require authentication if it is a write action or user is ambiguous
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function requiresAuth()
|
||||||
|
{
|
||||||
|
return parent::requiresAuth() ||
|
||||||
|
$this->create || $this->delete;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle request:
|
||||||
|
* Show the lists the user has created if the request method is GET
|
||||||
|
* Create a new list by diferring to handlePost() if it is POST.
|
||||||
|
*/
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
|
||||||
|
if($this->create) {
|
||||||
|
return $this->handlePost();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showXmlLists($this->lists, $this->next_cursor, $this->prev_cursor);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showJsonLists($this->lists, $this->next_cursor, $this->prev_cursor);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new list
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
function handlePost()
|
||||||
|
{
|
||||||
|
$name=$this->arg('name');
|
||||||
|
if(empty($name)) {
|
||||||
|
// mimick twitter
|
||||||
|
// TRANS: Client error displayed when trying to create a list without a name.
|
||||||
|
print _("A list must have a name.");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// twitter creates a new list by appending a number to the end
|
||||||
|
// if the list by the given name already exists
|
||||||
|
// it makes more sense to return the existing list instead
|
||||||
|
|
||||||
|
$private = null;
|
||||||
|
if ($this->arg('mode') === 'public') {
|
||||||
|
$private = false;
|
||||||
|
} else if ($this->arg('mode') === 'private') {
|
||||||
|
$private = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = Profile_list::ensureTag($this->auth_user->id,
|
||||||
|
$this->arg('name'),
|
||||||
|
$this->arg('description'),
|
||||||
|
$private);
|
||||||
|
if (empty($list)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showSingleXmlList($list);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showSingleJsonList($list);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get lists
|
||||||
|
*/
|
||||||
|
function getLists()
|
||||||
|
{
|
||||||
|
$cursor = (int) $this->arg('cursor', -1);
|
||||||
|
|
||||||
|
// twitter fixes count at 20
|
||||||
|
// there is no argument named count
|
||||||
|
$count = 20;
|
||||||
|
$profile = $this->user->getProfile();
|
||||||
|
$fn = array($profile, 'getLists');
|
||||||
|
|
||||||
|
list($this->lists,
|
||||||
|
$this->next_cursor,
|
||||||
|
$this->prev_cursor) = Profile_list::getAtCursor($fn, array($this->auth_user), $cursor, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isReadOnly($args)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function lastModified()
|
||||||
|
{
|
||||||
|
if (!$this->create && !empty($this->lists) && (count($this->lists) > 0)) {
|
||||||
|
return strtotime($this->lists[0]->created);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An entity tag for this list of lists
|
||||||
|
*
|
||||||
|
* 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 (!$this->create && !empty($this->lists) && (count($this->lists) > 0)) {
|
||||||
|
|
||||||
|
$last = count($this->lists) - 1;
|
||||||
|
|
||||||
|
return '"' . implode(
|
||||||
|
':',
|
||||||
|
array($this->arg('action'),
|
||||||
|
common_language(),
|
||||||
|
$this->user->id,
|
||||||
|
strtotime($this->lists[0]->created),
|
||||||
|
strtotime($this->lists[$last]->created))
|
||||||
|
)
|
||||||
|
. '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
95
actions/apilistsubscriber.php
Normal file
95
actions/apilistsubscriber.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Check if a user is subscribed 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
|
||||||
|
* @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/apiauth.php';
|
||||||
|
|
||||||
|
class ApiListSubscriberAction extends ApiBareAuthAction
|
||||||
|
{
|
||||||
|
var $list = null;
|
||||||
|
|
||||||
|
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)) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing list.
|
||||||
|
$this->clientError(_('List not found.'), 404, $this->format);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($this->user)) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing user.
|
||||||
|
$this->clientError(_('No such user.'), 404, $this->format);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
|
||||||
|
$arr = array('profile_tag_id' => $this->list->id,
|
||||||
|
'profile_id' => $this->user->id);
|
||||||
|
$sub = Profile_tag_subscription::pkeyGet($arr);
|
||||||
|
|
||||||
|
if(empty($sub)) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when a membership check for a user is nagative.
|
||||||
|
_('The specified user is not a subscriber of this list.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = $this->twitterUserArray($this->user->getProfile(), true);
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showTwitterXmlUser($user, 'user', true);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showSingleJsonUser($user);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
129
actions/apilistsubscribers.php
Normal file
129
actions/apilistsubscribers.php
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Show/add/remove list subscribers.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* @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/apilistusers.php';
|
||||||
|
|
||||||
|
class ApiListSubscribersAction extends ApiListUsersAction
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Subscribe to list
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
function handlePost()
|
||||||
|
{
|
||||||
|
$result = Profile_tag_subscription::add($this->list,
|
||||||
|
$this->auth_user);
|
||||||
|
|
||||||
|
if(empty($result)) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when an unknown error occurs in the list subscribers action.
|
||||||
|
_('An error occured.'),
|
||||||
|
500,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showSingleXmlList($this->list);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showSingleJsonList($this->list);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleDelete()
|
||||||
|
{
|
||||||
|
$args = array('profile_tag_id' => $this->list->id,
|
||||||
|
'profile_id' => $this->auth_user->id);
|
||||||
|
$ptag = Profile_tag_subscription::pkeyGet($args);
|
||||||
|
|
||||||
|
if(empty($ptag)) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when trying to unsubscribe from a non-subscribed list.
|
||||||
|
_('You are not subscribed to this list.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Profile_tag_subscription::remove($this->list, $this->auth_user);
|
||||||
|
|
||||||
|
if(empty($result)) {
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when an unknown error occurs unsubscribing from a list.
|
||||||
|
_('An error occured.'),
|
||||||
|
500,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showSingleXmlList($this->list);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showSingleJsonList($this->list);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getUsers()
|
||||||
|
{
|
||||||
|
$fn = array($this->list, 'getSubscribers');
|
||||||
|
list($this->users, $this->next_cursor, $this->prev_cursor) =
|
||||||
|
Profile_list::getAtCursor($fn, array(), $this->cursor, 20);
|
||||||
|
}
|
||||||
|
}
|
125
actions/apilistsubscriptions.php
Normal file
125
actions/apilistsubscriptions.php
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Get a list of lists a user is subscribed to.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* @copyright 2009 StatusNet, Inc.
|
||||||
|
* @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
|
||||||
|
* @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 ApiListSubscriptionsAction extends ApiBareAuthAction
|
||||||
|
{
|
||||||
|
var $lists = array();
|
||||||
|
var $cursor = -1;
|
||||||
|
var $next_cursor = 0;
|
||||||
|
var $prev_cursor = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take arguments for running
|
||||||
|
*
|
||||||
|
* @param array $args $_REQUEST args
|
||||||
|
*
|
||||||
|
* @return boolean success flag
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
|
||||||
|
$this->cursor = (int) $this->arg('cursor', -1);
|
||||||
|
$this->user = $this->getTargetUser($this->arg('user'));
|
||||||
|
$this->getLists();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the request
|
||||||
|
*
|
||||||
|
* Show the lists
|
||||||
|
*
|
||||||
|
* @param array $args $_REQUEST data (unused)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
|
||||||
|
if (empty($this->user)) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing user.
|
||||||
|
$this->clientError(_('No such user.'), 404, $this->format);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->showXmlLists($this->lists, $this->next_cursor, $this->prev_cursor);
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->showJsonLists($this->lists, $this->next_cursor, $this->prev_cursor);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
400,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if read only.
|
||||||
|
*
|
||||||
|
* MAY override
|
||||||
|
*
|
||||||
|
* @param array $args other arguments
|
||||||
|
*
|
||||||
|
* @return boolean is read only action?
|
||||||
|
*/
|
||||||
|
function isReadOnly($args)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLists()
|
||||||
|
{
|
||||||
|
if(empty($this->user)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$profile = $this->user->getProfile();
|
||||||
|
$fn = array($profile, 'getTagSubscriptions');
|
||||||
|
# 20 lists
|
||||||
|
list($this->lists, $this->next_cursor, $this->prev_cursor) =
|
||||||
|
Profile_list::getAtCursor($fn, array(), $this->cursor, 20);
|
||||||
|
}
|
||||||
|
}
|
@ -97,7 +97,7 @@ class ApiStatusesDestroyAction extends ApiAuthAction
|
|||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed trying to execute an unknown API method deleting a status.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404
|
404
|
||||||
);
|
);
|
||||||
|
@ -78,22 +78,6 @@ class ApiStatusesRetweetAction extends ApiAuthAction
|
|||||||
|
|
||||||
$this->user = $this->auth_user;
|
$this->user = $this->auth_user;
|
||||||
|
|
||||||
if ($this->user->id == $this->original->profile_id) {
|
|
||||||
// TRANS: Client error displayed trying to repeat an own notice through the API.
|
|
||||||
$this->clientError(_('Cannot repeat your own notice.'),
|
|
||||||
400, $this->format);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile = $this->user->getProfile();
|
|
||||||
|
|
||||||
if ($profile->hasRepeated($id)) {
|
|
||||||
// TRANS: Client error displayed trying to re-repeat a notice through the API.
|
|
||||||
$this->clientError(_('Already repeated that notice.'),
|
|
||||||
400, $this->format);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ class ApiStatusesRetweetsAction extends ApiAuthAction
|
|||||||
$this->showJsonTimeline($strm);
|
$this->showJsonTimeline($strm);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
|
|||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json', 'atom'))) {
|
if (!in_array($this->format, array('xml', 'json', 'atom'))) {
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), 404);
|
$this->clientError(_('API method not found.'), 404);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -239,8 +239,8 @@ class ApiStatusesUpdateAction extends ApiAuthAction
|
|||||||
|
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
sprintf(
|
sprintf(
|
||||||
// TRANS: Client error displayed when the parameter "status" is missing.
|
// TRANS: Client error displayed exceeding the maximum notice length.
|
||||||
// TRANS: %d is the maximum number of character for a notice.
|
// TRANS: %d is the maximum length for a notice.
|
||||||
_m('That\'s too long. Maximum notice size is %d character.',
|
_m('That\'s too long. Maximum notice size is %d character.',
|
||||||
'That\'s too long. Maximum notice size is %d characters.',
|
'That\'s too long. Maximum notice size is %d characters.',
|
||||||
Notice::maxContent()),
|
Notice::maxContent()),
|
||||||
|
@ -135,7 +135,7 @@ class ApiStatusnetConfigAction extends ApiAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -87,7 +87,7 @@ class ApiStatusnetVersionAction extends ApiPrivateAuthAction
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->clientError(
|
$this->clientError(
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
_('API method not found.'),
|
_('API method not found.'),
|
||||||
404,
|
404,
|
||||||
$this->format
|
$this->format
|
||||||
|
@ -105,7 +105,7 @@ class ApiSubscriptionsAction extends ApiBareAuthAction
|
|||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -204,6 +204,8 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
|
|||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
|
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
|
||||||
$sitename = common_config('site', 'name');
|
$sitename = common_config('site', 'name');
|
||||||
|
// TRANS: Title of API timeline for a user and friends.
|
||||||
|
// TRANS: %s is a username.
|
||||||
$title = sprintf(_("%s and friends"), $this->user->nickname);
|
$title = sprintf(_("%s and friends"), $this->user->nickname);
|
||||||
$taguribase = TagURI::base();
|
$taguribase = TagURI::base();
|
||||||
$id = "tag:$taguribase:FriendsTimeline:" . $this->user->id;
|
$id = "tag:$taguribase:FriendsTimeline:" . $this->user->id;
|
||||||
@ -272,7 +274,7 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -287,15 +289,12 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
|
|||||||
{
|
{
|
||||||
$notices = array();
|
$notices = array();
|
||||||
|
|
||||||
if (!empty($this->auth_user) && $this->auth_user->id == $this->user->id) {
|
$stream = new InboxNoticeStream($this->user);
|
||||||
$notice = $this->user->ownFriendsTimeline(($this->page-1) * $this->count,
|
|
||||||
$this->count, $this->since_id,
|
$notice = $stream->getNotices(($this->page-1) * $this->count,
|
||||||
$this->max_id);
|
$this->count,
|
||||||
} else {
|
$this->since_id,
|
||||||
$notice = $this->user->friendsTimeline(($this->page-1) * $this->count,
|
$this->max_id);
|
||||||
$this->count, $this->since_id,
|
|
||||||
$this->max_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ($notice->fetch()) {
|
while ($notice->fetch()) {
|
||||||
$notices[] = clone($notice);
|
$notices[] = clone($notice);
|
||||||
|
@ -177,7 +177,7 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -192,19 +192,12 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
|
|||||||
{
|
{
|
||||||
$notices = array();
|
$notices = array();
|
||||||
|
|
||||||
if (!empty($this->auth_user) && $this->auth_user->id == $this->user->id) {
|
$stream = new InboxNoticeStream($this->user);
|
||||||
$notice = $this->user->noticeInbox(
|
|
||||||
($this->page-1) * $this->count,
|
$notice = $stream->getNotices(($this->page-1) * $this->count,
|
||||||
$this->count, $this->since_id,
|
$this->count,
|
||||||
$this->max_id
|
$this->since_id,
|
||||||
);
|
$this->max_id);
|
||||||
} else {
|
|
||||||
$notice = $this->user->noticesWithFriends(
|
|
||||||
($this->page-1) * $this->count,
|
|
||||||
$this->count, $this->since_id,
|
|
||||||
$this->max_id
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ($notice->fetch()) {
|
while ($notice->fetch()) {
|
||||||
$notices[] = clone($notice);
|
$notices[] = clone($notice);
|
||||||
|
258
actions/apitimelinelist.php
Normal file
258
actions/apitimelinelist.php
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Show a list's notices
|
||||||
|
*
|
||||||
|
* 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 Craig Andrews <candrews@integralblue.com>
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @author Jeffery To <jeffery.to@gmail.com>
|
||||||
|
* @author Zach Copley <zach@status.net>
|
||||||
|
* @copyright 2009 StatusNet, Inc.
|
||||||
|
* @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
|
||||||
|
* @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/apiprivateauth.php';
|
||||||
|
require_once INSTALLDIR . '/lib/atomlistnoticefeed.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the most recent notices (default 20) posted to the list specified by ID
|
||||||
|
*
|
||||||
|
* @category API
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Craig Andrews <candrews@integralblue.com>
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @author Jeffery To <jeffery.to@gmail.com>
|
||||||
|
* @author Zach Copley <zach@status.net>
|
||||||
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||||
|
* @link http://status.net/
|
||||||
|
*/
|
||||||
|
class ApiTimelineListAction extends ApiPrivateAuthAction
|
||||||
|
{
|
||||||
|
|
||||||
|
var $list = null;
|
||||||
|
var $notices = array();
|
||||||
|
var $next_cursor = 0;
|
||||||
|
var $prev_cursor = 0;
|
||||||
|
var $cursor = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take arguments for running
|
||||||
|
*
|
||||||
|
* @param array $args $_REQUEST args
|
||||||
|
*
|
||||||
|
* @return boolean success flag
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
|
||||||
|
$this->cursor = (int) $this->arg('cursor', -1);
|
||||||
|
$this->list = $this->getTargetList($this->arg('user'), $this->arg('id'));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the request
|
||||||
|
*
|
||||||
|
* Just show the notices
|
||||||
|
*
|
||||||
|
* @param array $args $_REQUEST data (unused)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
|
||||||
|
if (empty($this->list)) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing list.
|
||||||
|
$this->clientError(_('List not found.'), 404, $this->format);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->getNotices();
|
||||||
|
$this->showTimeline();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the timeline of notices
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function showTimeline()
|
||||||
|
{
|
||||||
|
// We'll pull common formatting out of this for other formats
|
||||||
|
$atom = new AtomListNoticeFeed($this->list, $this->auth_user);
|
||||||
|
|
||||||
|
$self = $this->getSelfUri();
|
||||||
|
|
||||||
|
switch($this->format) {
|
||||||
|
case 'xml':
|
||||||
|
$this->initDocument('xml');
|
||||||
|
$this->elementStart('statuses_list',
|
||||||
|
array('xmlns:statusnet' => 'http://status.net/schema/api/1/'));
|
||||||
|
$this->elementStart('statuses', array('type' => 'array'));
|
||||||
|
|
||||||
|
foreach ($this->notices as $n) {
|
||||||
|
$twitter_status = $this->twitterStatusArray($n);
|
||||||
|
$this->showTwitterXmlStatus($twitter_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->elementEnd('statuses');
|
||||||
|
$this->element('next_cursor', null, $this->next_cursor);
|
||||||
|
$this->element('previous_cursor', null, $this->prev_cursor);
|
||||||
|
$this->elementEnd('statuses_list');
|
||||||
|
$this->endDocument('xml');
|
||||||
|
break;
|
||||||
|
case 'rss':
|
||||||
|
$this->showRssTimeline(
|
||||||
|
$this->notices,
|
||||||
|
$atom->title,
|
||||||
|
$this->list->getUri(),
|
||||||
|
$atom->subtitle,
|
||||||
|
null,
|
||||||
|
$atom->logo,
|
||||||
|
$self
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 'atom':
|
||||||
|
header('Content-Type: application/atom+xml; charset=utf-8');
|
||||||
|
|
||||||
|
try {
|
||||||
|
$atom->setId($self);
|
||||||
|
$atom->setSelfLink($self);
|
||||||
|
$atom->addEntryFromNotices($this->notices);
|
||||||
|
$this->raw($atom->getString());
|
||||||
|
} catch (Atom10FeedException $e) {
|
||||||
|
// TRANS: Server error displayed whe trying to get a timeline fails.
|
||||||
|
// TRANS: %s is the error message.
|
||||||
|
$this->serverError( sprintf(_('Could not generate feed for list - %s'),$e->getMessage()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
$this->initDocument('json');
|
||||||
|
|
||||||
|
$statuses = array();
|
||||||
|
foreach ($this->notices as $n) {
|
||||||
|
$twitter_status = $this->twitterStatusArray($n);
|
||||||
|
array_push($statuses, $twitter_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
$statuses_list = array('statuses' => $statuses,
|
||||||
|
'next_cursor' => $this->next_cusror,
|
||||||
|
'next_cursor_str' => strval($this->next_cusror),
|
||||||
|
'previous_cursor' => $this->prev_cusror,
|
||||||
|
'previous_cursor_str' => strval($this->prev_cusror)
|
||||||
|
);
|
||||||
|
$this->showJsonObjects($statuses_list);
|
||||||
|
|
||||||
|
$this->initDocument('json');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->clientError(
|
||||||
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
|
_('API method not found.'),
|
||||||
|
404,
|
||||||
|
$this->format
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get notices
|
||||||
|
*
|
||||||
|
* @return array notices
|
||||||
|
*/
|
||||||
|
function getNotices()
|
||||||
|
{
|
||||||
|
$fn = array($this->list, 'getNotices');
|
||||||
|
list($this->notices, $this->next_cursor, $this->prev_cursor) =
|
||||||
|
Profile_list::getAtCursor($fn, array(), $this->cursor, 20);
|
||||||
|
if (!$this->notices) {
|
||||||
|
$this->notices = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this action read only?
|
||||||
|
*
|
||||||
|
* @param array $args other arguments
|
||||||
|
*
|
||||||
|
* @return boolean true
|
||||||
|
*/
|
||||||
|
function isReadOnly($args)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When was this feed last modified?
|
||||||
|
*
|
||||||
|
* @return string datestamp of the latest notice in the stream
|
||||||
|
*/
|
||||||
|
function lastModified()
|
||||||
|
{
|
||||||
|
if (!empty($this->notices) && (count($this->notices) > 0)) {
|
||||||
|
return strtotime($this->notices[0]->created);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An entity tag for this stream
|
||||||
|
*
|
||||||
|
* Returns an Etag based on the action name, language, list ID and
|
||||||
|
* timestamps of the first and last notice in the timeline
|
||||||
|
*
|
||||||
|
* @return string etag
|
||||||
|
*/
|
||||||
|
function etag()
|
||||||
|
{
|
||||||
|
if (!empty($this->notices) && (count($this->notices) > 0)) {
|
||||||
|
|
||||||
|
$last = count($this->notices) - 1;
|
||||||
|
|
||||||
|
return '"' . implode(
|
||||||
|
':',
|
||||||
|
array($this->arg('action'),
|
||||||
|
common_language(),
|
||||||
|
$this->list->id,
|
||||||
|
strtotime($this->notices[0]->created),
|
||||||
|
strtotime($this->notices[$last]->created))
|
||||||
|
)
|
||||||
|
. '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -178,7 +178,7 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -243,7 +243,7 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -146,7 +146,7 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,8 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction
|
|||||||
$profile = $this->auth_user->getProfile();
|
$profile = $this->auth_user->getProfile();
|
||||||
|
|
||||||
$subtitle = sprintf(
|
$subtitle = sprintf(
|
||||||
|
// TRANS: Subtitle of API time with retweets of me.
|
||||||
|
// TRANS: %1$s is the StatusNet sitename, %2$s is the user nickname, %3$s is the user profile name.
|
||||||
_('%1$s notices that %2$s / %3$s has repeated.'),
|
_('%1$s notices that %2$s / %3$s has repeated.'),
|
||||||
$sitename, $this->auth_user->nickname, $profile->getBestName()
|
$sitename, $this->auth_user->nickname, $profile->getBestName()
|
||||||
);
|
);
|
||||||
@ -143,7 +145,7 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), 404);
|
$this->clientError(_('API method not found.'), 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -161,7 +161,7 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -213,7 +213,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction
|
|||||||
$this->raw($doc->asString());
|
$this->raw($doc->asString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ class ApiUserProfileImageAction extends ApiPrivateAuthAction
|
|||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (empty($profile)) {
|
if (empty($profile)) {
|
||||||
// TRANS: Client error displayed when requesting user information for a user without a profile.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->clientError(_('User has no profile.'));
|
$this->clientError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ class ApiUserShowAction extends ApiPrivateAuthAction
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!in_array($this->format, array('xml', 'json'))) {
|
if (!in_array($this->format, array('xml', 'json'))) {
|
||||||
// TRANS: Client error displayed when trying to handle an unknown API method.
|
// TRANS: Client error displayed when coming across a non-supported API method.
|
||||||
$this->clientError(_('API method not found.'), $code = 404);
|
$this->clientError(_('API method not found.'), $code = 404);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ class ApiUserShowAction extends ApiPrivateAuthAction
|
|||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (empty($profile)) {
|
if (empty($profile)) {
|
||||||
// TRANS: Client error displayed when requesting user information for a user without a profile.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->clientError(_('User has no profile.'));
|
$this->clientError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -121,6 +121,7 @@ class ApprovegroupAction extends Action
|
|||||||
|
|
||||||
if (empty($this->request)) {
|
if (empty($this->request)) {
|
||||||
// TRANS: Client error displayed trying to approve group membership for a non-existing request.
|
// TRANS: Client error displayed trying to approve group membership for a non-existing request.
|
||||||
|
// TRANS: %s is a nickname.
|
||||||
$this->clientError(sprintf(_('%s is not in the moderation queue for this group.'), $this->profile->nickname), 403);
|
$this->clientError(sprintf(_('%s is not in the moderation queue for this group.'), $this->profile->nickname), 403);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,12 +153,12 @@ class ApprovegroupAction extends Action
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if ($this->approve) {
|
if ($this->approve) {
|
||||||
$this->profile->completeJoinGroup($this->group);
|
$this->request->complete();
|
||||||
} elseif ($this->cancel) {
|
} elseif ($this->cancel) {
|
||||||
$this->profile->cancelJoinGroup($this->group);
|
$this->request->abort();
|
||||||
}
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
common_log(LOG_ERROR, "Exception canceling group sub: " . $e->getMessage());
|
common_log(LOG_ERR, "Exception canceling group sub: " . $e->getMessage());
|
||||||
// TRANS: Server error displayed when cancelling a queued group join request fails.
|
// TRANS: Server error displayed when cancelling a queued group join request fails.
|
||||||
// TRANS: %1$s is the leaving user's nickname, $2$s is the group nickname for which the leave failed.
|
// TRANS: %1$s is the leaving user's nickname, $2$s is the group nickname for which the leave failed.
|
||||||
$this->serverError(sprintf(_('Could not cancel request for user %1$s to join group %2$s.'),
|
$this->serverError(sprintf(_('Could not cancel request for user %1$s to join group %2$s.'),
|
||||||
@ -176,10 +177,10 @@ class ApprovegroupAction extends Action
|
|||||||
$this->elementEnd('head');
|
$this->elementEnd('head');
|
||||||
$this->elementStart('body');
|
$this->elementStart('body');
|
||||||
if ($this->approve) {
|
if ($this->approve) {
|
||||||
// TRANS: Message on page for group admin after approving a join request.
|
// TRANS: Message on page for group admin after approving a join request.
|
||||||
$this->element('p', 'success', _('Join request approved.'));
|
$this->element('p', 'success', _('Join request approved.'));
|
||||||
} elseif ($this->cancel) {
|
} elseif ($this->cancel) {
|
||||||
// TRANS: Message on page for group admin after rejecting a join request.
|
// TRANS: Message on page for group admin after rejecting a join request.
|
||||||
$this->element('p', 'success', _('Join request canceled.'));
|
$this->element('p', 'success', _('Join request canceled.'));
|
||||||
}
|
}
|
||||||
$this->elementEnd('body');
|
$this->elementEnd('body');
|
||||||
|
145
actions/approvesub.php
Normal file
145
actions/approvesub.php
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Approve group subscription request
|
||||||
|
*
|
||||||
|
* 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 Group
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @copyright 2008-2009 StatusNet, Inc.
|
||||||
|
* @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') && !defined('LACONICA')) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Leave a group
|
||||||
|
*
|
||||||
|
* This is the action for leaving a group. It works more or less like the subscribe action
|
||||||
|
* for users.
|
||||||
|
*
|
||||||
|
* @category Group
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||||
|
* @link http://status.net/
|
||||||
|
*/
|
||||||
|
class ApprovesubAction extends Action
|
||||||
|
{
|
||||||
|
var $profile = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare to run
|
||||||
|
*/
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
|
||||||
|
$cur = common_current_user();
|
||||||
|
if (empty($cur)) {
|
||||||
|
// TRANS: Client error displayed trying to approve group membership while not logged in.
|
||||||
|
$this->clientError(_('Must be logged in.'), 403);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($this->arg('profile_id')) {
|
||||||
|
$this->profile = Profile::staticGet('id', $this->arg('profile_id'));
|
||||||
|
} else {
|
||||||
|
// TRANS: Client error displayed trying to approve subscriptionswithout specifying a profile to approve.
|
||||||
|
$this->clientError(_('Must specify a profile.'));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->request = Subscription_queue::pkeyGet(array('subscriber' => $this->profile->id,
|
||||||
|
'subscribed' => $cur->id));
|
||||||
|
|
||||||
|
if (empty($this->request)) {
|
||||||
|
// TRANS: Client error displayed trying to approve subscription for a non-existing request.
|
||||||
|
$this->clientError(sprintf(_('%s is not in the moderation queue for your subscriptions.'), $this->profile->nickname), 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->approve = (bool)$this->arg('approve');
|
||||||
|
$this->cancel = (bool)$this->arg('cancel');
|
||||||
|
if (!$this->approve && !$this->cancel) {
|
||||||
|
// TRANS: Client error displayed trying to approve/deny subscription.
|
||||||
|
$this->clientError(_('Internal error: received neither cancel nor abort.'));
|
||||||
|
}
|
||||||
|
if ($this->approve && $this->cancel) {
|
||||||
|
// TRANS: Client error displayed trying to approve/deny subscription
|
||||||
|
$this->clientError(_('Internal error: received both cancel and abort.'));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the request
|
||||||
|
*
|
||||||
|
* On POST, add the current user to the group
|
||||||
|
*
|
||||||
|
* @param array $args unused
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
$cur = common_current_user();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ($this->approve) {
|
||||||
|
$this->request->complete();
|
||||||
|
} elseif ($this->cancel) {
|
||||||
|
$this->request->abort();
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
common_log(LOG_ERR, "Exception canceling sub: " . $e->getMessage());
|
||||||
|
// TRANS: Server error displayed when cancelling a queued subscription request fails.
|
||||||
|
// TRANS: %1$s is the leaving user's nickname, $2$s is the nickname for which the leave failed.
|
||||||
|
$this->serverError(sprintf(_('Could not cancel or approve request for user %1$s to join group %2$s.'),
|
||||||
|
$this->profile->nickname, $cur->nickname));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->boolean('ajax')) {
|
||||||
|
$this->startHTML('text/xml;charset=utf-8');
|
||||||
|
$this->elementStart('head');
|
||||||
|
// TRANS: Title for subscription approval ajax return
|
||||||
|
// TRANS: %1$s is the approved user's nickname
|
||||||
|
$this->element('title', null, sprintf(_m('TITLE','%1$s\'s request'),
|
||||||
|
$this->profile->nickname));
|
||||||
|
$this->elementEnd('head');
|
||||||
|
$this->elementStart('body');
|
||||||
|
if ($this->approve) {
|
||||||
|
// TRANS: Message on page for user after approving a subscription request.
|
||||||
|
$this->element('p', 'success', _('Subscription approved.'));
|
||||||
|
} elseif ($this->cancel) {
|
||||||
|
// TRANS: Message on page for user after rejecting a subscription request.
|
||||||
|
$this->element('p', 'success', _('Subscription canceled.'));
|
||||||
|
}
|
||||||
|
$this->elementEnd('body');
|
||||||
|
$this->elementEnd('html');
|
||||||
|
} else {
|
||||||
|
common_redirect(common_local_url('subqueue', array('nickname' =>
|
||||||
|
$cur->nickname)),
|
||||||
|
303);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -143,15 +143,6 @@ class AttachmentAction extends Action
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Don't show local navigation
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function showLocalNavBlock()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fill the content area of the page
|
* Fill the content area of the page
|
||||||
*
|
*
|
||||||
|
@ -81,7 +81,7 @@ class AvatarbynicknameAction extends Action
|
|||||||
}
|
}
|
||||||
$profile = $user->getProfile();
|
$profile = $user->getProfile();
|
||||||
if (!$profile) {
|
if (!$profile) {
|
||||||
// TRANS: Client error displayed trying to get an avatar for a user without a profile.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->clientError(_('User has no profile.'));
|
$this->clientError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -104,8 +104,8 @@ class AvatarsettingsAction extends SettingsAction
|
|||||||
|
|
||||||
if (!$profile) {
|
if (!$profile) {
|
||||||
common_log_db_error($user, 'SELECT', __FILE__);
|
common_log_db_error($user, 'SELECT', __FILE__);
|
||||||
// TRANS: Server error displayed in avatar upload page when no matching profile can be found for a user.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->serverError(_('User without matching profile.'));
|
$this->serverError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,13 +146,15 @@ class AvatarsettingsAction extends SettingsAction
|
|||||||
// TRANS: Header on avatar upload page for thumbnail of to be used rendition of uploaded avatar (h2).
|
// TRANS: Header on avatar upload page for thumbnail of to be used rendition of uploaded avatar (h2).
|
||||||
$this->element('h2', null, _("Preview"));
|
$this->element('h2', null, _("Preview"));
|
||||||
$this->elementStart('div', array('id'=>'avatar_preview_view'));
|
$this->elementStart('div', array('id'=>'avatar_preview_view'));
|
||||||
$this->element('img', array('src' => $original->url,
|
$this->element('img', array('src' => $avatar->url,
|
||||||
'width' => AVATAR_PROFILE_SIZE,
|
'width' => AVATAR_PROFILE_SIZE,
|
||||||
'height' => AVATAR_PROFILE_SIZE,
|
'height' => AVATAR_PROFILE_SIZE,
|
||||||
'alt' => $user->nickname));
|
'alt' => $user->nickname));
|
||||||
$this->elementEnd('div');
|
$this->elementEnd('div');
|
||||||
// TRANS: Button on avatar upload page to delete current avatar.
|
if (!empty($avatar->filename)) {
|
||||||
$this->submit('delete', _m('BUTTON','Delete'));
|
// TRANS: Button on avatar upload page to delete current avatar.
|
||||||
|
$this->submit('delete', _m('BUTTON','Delete'));
|
||||||
|
}
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,8 +190,8 @@ class AvatarsettingsAction extends SettingsAction
|
|||||||
|
|
||||||
if (!$profile) {
|
if (!$profile) {
|
||||||
common_log_db_error($user, 'SELECT', __FILE__);
|
common_log_db_error($user, 'SELECT', __FILE__);
|
||||||
// TRANS: Server error displayed in avatar upload page when no matching profile can be found for a user.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->serverError(_('User without matching profile.'));
|
$this->serverError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,6 +279,7 @@ class AvatarsettingsAction extends SettingsAction
|
|||||||
|
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->showForm(_('There was a problem with your session token. '.
|
$this->showForm(_('There was a problem with your session token. '.
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
return;
|
return;
|
||||||
|
@ -139,9 +139,9 @@ class CancelgroupAction extends Action
|
|||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->profile->cancelJoinGroup($this->group);
|
$this->request->abort();
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
common_log(LOG_ERROR, "Exception canceling group sub: " . $e->getMessage());
|
common_log(LOG_ERR, "Exception canceling group sub: " . $e->getMessage());
|
||||||
// TRANS: Server error displayed when cancelling a queued group join request fails.
|
// TRANS: Server error displayed when cancelling a queued group join request fails.
|
||||||
// TRANS: %1$s is the leaving user's nickname, $2$s is the group nickname for which the leave failed.
|
// TRANS: %1$s is the leaving user's nickname, $2$s is the group nickname for which the leave failed.
|
||||||
$this->serverError(sprintf(_('Could not cancel request for user %1$s to join group %2$s.'),
|
$this->serverError(sprintf(_('Could not cancel request for user %1$s to join group %2$s.'),
|
||||||
|
124
actions/cancelsubscription.php
Normal file
124
actions/cancelsubscription.php
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Leave a group
|
||||||
|
*
|
||||||
|
* 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 Group
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @copyright 2008-2009 StatusNet, Inc.
|
||||||
|
* @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') && !defined('LACONICA')) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Leave a group
|
||||||
|
*
|
||||||
|
* This is the action for leaving a group. It works more or less like the subscribe action
|
||||||
|
* for users.
|
||||||
|
*
|
||||||
|
* @category Group
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Evan Prodromou <evan@status.net>
|
||||||
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||||
|
* @link http://status.net/
|
||||||
|
*/
|
||||||
|
class CancelsubscriptionAction extends Action
|
||||||
|
{
|
||||||
|
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
if ($this->boolean('ajax')) {
|
||||||
|
StatusNet::setApi(true);
|
||||||
|
}
|
||||||
|
if (!common_logged_in()) {
|
||||||
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
|
$this->clientError(_('Not logged in.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = common_current_user();
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
|
||||||
|
common_redirect(common_local_url('subscriptions',
|
||||||
|
array('nickname' => $user->nickname)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use a session token for CSRF protection. */
|
||||||
|
|
||||||
|
$token = $this->trimmed('token');
|
||||||
|
|
||||||
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
|
$this->clientError(_('There was a problem with your session token. ' .
|
||||||
|
'Try again, please.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$other_id = $this->arg('unsubscribeto');
|
||||||
|
|
||||||
|
if (!$other_id) {
|
||||||
|
// TRANS: Client error displayed when trying to leave a group without specifying an ID.
|
||||||
|
$this->clientError(_('No profile ID in request.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$other = Profile::staticGet('id', $other_id);
|
||||||
|
|
||||||
|
if (!$other) {
|
||||||
|
// TRANS: Client error displayed when trying to leave a non-existing group.
|
||||||
|
$this->clientError(_('No profile with that ID.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->request = Subscription_queue::pkeyGet(array('subscriber' => $user->id,
|
||||||
|
'subscribed' => $other->id));
|
||||||
|
|
||||||
|
if (empty($this->request)) {
|
||||||
|
// TRANS: Client error displayed when trying to approve a non-existing group join request.
|
||||||
|
// TRANS: %s is a user nickname.
|
||||||
|
$this->clientError(sprintf(_('%s is not in the moderation queue for this group.'), $this->profile->nickname), 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->request->abort();
|
||||||
|
|
||||||
|
if ($this->boolean('ajax')) {
|
||||||
|
$this->startHTML('text/xml;charset=utf-8');
|
||||||
|
$this->elementStart('head');
|
||||||
|
// TRANS: Title after unsubscribing from a group.
|
||||||
|
$this->element('title', null, _m('TITLE','Unsubscribed'));
|
||||||
|
$this->elementEnd('head');
|
||||||
|
$this->elementStart('body');
|
||||||
|
$subscribe = new SubscribeForm($this, $other);
|
||||||
|
$subscribe->show();
|
||||||
|
$this->elementEnd('body');
|
||||||
|
$this->elementEnd('html');
|
||||||
|
} else {
|
||||||
|
common_redirect(common_local_url('subscriptions',
|
||||||
|
array('nickname' => $user->nickname)),
|
||||||
|
303);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -47,8 +47,12 @@ require_once INSTALLDIR.'/lib/noticelist.php';
|
|||||||
*/
|
*/
|
||||||
class ConversationAction extends Action
|
class ConversationAction extends Action
|
||||||
{
|
{
|
||||||
var $id = null;
|
var $id = null;
|
||||||
var $page = null;
|
var $page = null;
|
||||||
|
var $notices = null;
|
||||||
|
var $userProfile = null;
|
||||||
|
|
||||||
|
const MAX_NOTICES = 500;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization.
|
* Initialization.
|
||||||
@ -69,6 +73,19 @@ class ConversationAction extends Action
|
|||||||
if (empty($this->page)) {
|
if (empty($this->page)) {
|
||||||
$this->page = 1;
|
$this->page = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$cur = common_current_user();
|
||||||
|
|
||||||
|
if (empty($cur)) {
|
||||||
|
$this->userProfile = null;
|
||||||
|
} else {
|
||||||
|
$this->userProfile = $cur->getProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
$stream = new ConversationNoticeStream($this->id, $this->userProfile);
|
||||||
|
|
||||||
|
$this->notices = $stream->getNotices(0, self::MAX_NOTICES);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,11 +123,9 @@ class ConversationAction extends Action
|
|||||||
*/
|
*/
|
||||||
function showContent()
|
function showContent()
|
||||||
{
|
{
|
||||||
$notices = Notice::conversationStream($this->id, null, null);
|
$tnl = new FullThreadedNoticeList($this->notices, $this, $this->userProfile);
|
||||||
|
|
||||||
$ct = new ConversationTree($notices, $this);
|
$cnt = $tnl->show();
|
||||||
|
|
||||||
$cnt = $ct->show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function isReadOnly()
|
function isReadOnly()
|
||||||
@ -118,173 +133,3 @@ class ConversationAction extends Action
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Conversation tree
|
|
||||||
*
|
|
||||||
* The widget class for displaying a hierarchical list of notices.
|
|
||||||
*
|
|
||||||
* @category Widget
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class ConversationTree extends NoticeList
|
|
||||||
{
|
|
||||||
var $tree = null;
|
|
||||||
var $table = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the tree of notices
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function show()
|
|
||||||
{
|
|
||||||
$cnt = $this->_buildTree();
|
|
||||||
|
|
||||||
$this->out->elementStart('div', array('id' =>'notices_primary'));
|
|
||||||
// TRANS: Header on conversation page. Hidden by default (h2).
|
|
||||||
$this->out->element('h2', null, _('Notices'));
|
|
||||||
$this->out->elementStart('ol', array('class' => 'notices xoxo'));
|
|
||||||
|
|
||||||
if (array_key_exists('root', $this->tree)) {
|
|
||||||
$rootid = $this->tree['root'][0];
|
|
||||||
$this->showNoticePlus($rootid);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->out->elementEnd('ol');
|
|
||||||
$this->out->elementEnd('div');
|
|
||||||
|
|
||||||
return $cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _buildTree()
|
|
||||||
{
|
|
||||||
$cnt = 0;
|
|
||||||
|
|
||||||
$this->tree = array();
|
|
||||||
$this->table = array();
|
|
||||||
|
|
||||||
while ($this->notice->fetch()) {
|
|
||||||
|
|
||||||
$cnt++;
|
|
||||||
|
|
||||||
$id = $this->notice->id;
|
|
||||||
$notice = clone($this->notice);
|
|
||||||
|
|
||||||
$this->table[$id] = $notice;
|
|
||||||
|
|
||||||
if (is_null($notice->reply_to)) {
|
|
||||||
$this->tree['root'] = array($notice->id);
|
|
||||||
} else if (array_key_exists($notice->reply_to, $this->tree)) {
|
|
||||||
$this->tree[$notice->reply_to][] = $notice->id;
|
|
||||||
} else {
|
|
||||||
$this->tree[$notice->reply_to] = array($notice->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shows a notice plus its list of children.
|
|
||||||
*
|
|
||||||
* @param integer $id ID of the notice to show
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function showNoticePlus($id)
|
|
||||||
{
|
|
||||||
$notice = $this->table[$id];
|
|
||||||
|
|
||||||
// We take responsibility for doing the li
|
|
||||||
|
|
||||||
$this->out->elementStart('li', array('class' => 'hentry notice',
|
|
||||||
'id' => 'notice-' . $id));
|
|
||||||
|
|
||||||
$item = $this->newListItem($notice);
|
|
||||||
$item->show();
|
|
||||||
|
|
||||||
if (array_key_exists($id, $this->tree)) {
|
|
||||||
$children = $this->tree[$id];
|
|
||||||
|
|
||||||
$this->out->elementStart('ol', array('class' => 'notices'));
|
|
||||||
|
|
||||||
sort($children);
|
|
||||||
|
|
||||||
foreach ($children as $child) {
|
|
||||||
$this->showNoticePlus($child);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->out->elementEnd('ol');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->out->elementEnd('li');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Override parent class to return our preferred item.
|
|
||||||
*
|
|
||||||
* @param Notice $notice Notice to display
|
|
||||||
*
|
|
||||||
* @return NoticeListItem a list item to show
|
|
||||||
*/
|
|
||||||
function newListItem($notice)
|
|
||||||
{
|
|
||||||
return new ConversationTreeItem($notice, $this->out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Conversation tree list item
|
|
||||||
*
|
|
||||||
* Special class of NoticeListItem for use inside conversation trees.
|
|
||||||
*
|
|
||||||
* @category Widget
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
class ConversationTreeItem extends NoticeListItem
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* start a single notice.
|
|
||||||
*
|
|
||||||
* The default creates the <li>; we skip, since the ConversationTree
|
|
||||||
* takes care of that.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function showStart()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* finish the notice
|
|
||||||
*
|
|
||||||
* The default closes the <li>; we skip, since the ConversationTree
|
|
||||||
* takes care of that.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function showEnd()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* show link to notice conversation page
|
|
||||||
*
|
|
||||||
* Since we're only used on the conversation page, we skip this
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function showContext()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -66,9 +66,7 @@ class ConversationRepliesAction extends ConversationAction
|
|||||||
*/
|
*/
|
||||||
function showContent()
|
function showContent()
|
||||||
{
|
{
|
||||||
$notices = Notice::conversationStream($this->id, null, null);
|
$ct = new FullThreadedNoticeList($this->notices, $this, $this->userProfile);
|
||||||
|
|
||||||
$ct = new FullThreadedNoticeList($notices, $this);
|
|
||||||
|
|
||||||
$cnt = $ct->show();
|
$cnt = $ct->show();
|
||||||
}
|
}
|
||||||
@ -88,19 +86,3 @@ class ConversationRepliesAction extends ConversationAction
|
|||||||
$this->elementEnd('html');
|
$this->elementEnd('html');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FullThreadedNoticeList extends ThreadedNoticeList
|
|
||||||
{
|
|
||||||
function newListItem($notice)
|
|
||||||
{
|
|
||||||
return new FullThreadedNoticeListItem($notice, $this->out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FullThreadedNoticeListItem extends ThreadedNoticeListItem
|
|
||||||
{
|
|
||||||
function initialItems()
|
|
||||||
{
|
|
||||||
return 1000; // @fixme
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -99,6 +99,7 @@ class DeleteapplicationAction extends Action
|
|||||||
// CSRF protection
|
// CSRF protection
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token.'));
|
$this->clientError(_('There was a problem with your session token.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ class DeletenoticeAction extends Action
|
|||||||
$this->user = common_current_user();
|
$this->user = common_current_user();
|
||||||
|
|
||||||
if (!$this->user) {
|
if (!$this->user) {
|
||||||
// TRANS: Error message displayed trying to delete a notice while not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
common_user_error(_('Not logged in.'));
|
common_user_error(_('Not logged in.'));
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
@ -174,6 +174,7 @@ class DeletenoticeAction extends Action
|
|||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
|
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->showForm(_('There was a problem with your session token. ' .
|
$this->showForm(_('There was a problem with your session token. ' .
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
return;
|
return;
|
||||||
|
@ -57,7 +57,7 @@ class DisfavorAction extends Action
|
|||||||
{
|
{
|
||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed when trying to remove a favorite while not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -147,80 +147,19 @@ class DocAction extends Action
|
|||||||
{
|
{
|
||||||
if (Event::handle('StartLoadDoc', array(&$this->title, &$this->output))) {
|
if (Event::handle('StartLoadDoc', array(&$this->title, &$this->output))) {
|
||||||
|
|
||||||
$this->filename = $this->getFilename();
|
$paths = DocFile::defaultPaths();
|
||||||
|
|
||||||
if (empty($this->filename)) {
|
$docfile = DocFile::forTitle($this->title, $paths);
|
||||||
|
|
||||||
|
if (empty($docfile)) {
|
||||||
// TRANS: Client exception thrown when requesting a document from the documentation that does not exist.
|
// TRANS: Client exception thrown when requesting a document from the documentation that does not exist.
|
||||||
// TRANS: %s is the non-existing document.
|
// TRANS: %s is the non-existing document.
|
||||||
throw new ClientException(sprintf(_('No such document "%s".'), $this->title), 404);
|
throw new ClientException(sprintf(_('No such document "%s".'), $this->title), 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
$c = file_get_contents($this->filename);
|
$this->output = $docfile->toHTML();
|
||||||
|
|
||||||
$this->output = common_markup_to_html($c);
|
|
||||||
|
|
||||||
Event::handle('EndLoadDoc', array($this->title, &$this->output));
|
Event::handle('EndLoadDoc', array($this->title, &$this->output));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFilename()
|
|
||||||
{
|
|
||||||
$localDef = null;
|
|
||||||
$local = null;
|
|
||||||
|
|
||||||
$site = StatusNet::currentSite();
|
|
||||||
|
|
||||||
if (!empty($site) && file_exists(INSTALLDIR.'/local/doc-src/'.$site.'/'.$this->title)) {
|
|
||||||
$localDef = INSTALLDIR.'/local/doc-src/'.$site.'/'.$this->title;
|
|
||||||
|
|
||||||
$local = glob(INSTALLDIR.'/local/doc-src/'.$site.'/'.$this->title.'.*');
|
|
||||||
if ($local === false) {
|
|
||||||
// Some systems return false, others array(), if dir didn't exist.
|
|
||||||
$local = array();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (file_exists(INSTALLDIR.'/local/doc-src/'.$this->title)) {
|
|
||||||
$localDef = INSTALLDIR.'/local/doc-src/'.$this->title;
|
|
||||||
}
|
|
||||||
|
|
||||||
$local = glob(INSTALLDIR.'/local/doc-src/'.$this->title.'.*');
|
|
||||||
if ($local === false) {
|
|
||||||
$local = array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($local) || isset($localDef)) {
|
|
||||||
return $this->negotiateLanguage($local, $localDef);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file_exists(INSTALLDIR.'/doc-src/'.$this->title)) {
|
|
||||||
$distDef = INSTALLDIR.'/doc-src/'.$this->title;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dist = glob(INSTALLDIR.'/doc-src/'.$this->title.'.*');
|
|
||||||
if ($dist === false) {
|
|
||||||
$dist = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($dist) || isset($distDef)) {
|
|
||||||
return $this->negotiateLanguage($dist, $distDef);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function negotiateLanguage($filenames, $defaultFilename=null)
|
|
||||||
{
|
|
||||||
// XXX: do this better
|
|
||||||
|
|
||||||
$langcode = common_language();
|
|
||||||
|
|
||||||
foreach ($filenames as $filename) {
|
|
||||||
if (preg_match('/\.'.$langcode.'$/', $filename)) {
|
|
||||||
return $filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $defaultFilename;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -128,6 +128,7 @@ class EditApplicationAction extends OwnerDesignAction
|
|||||||
// CSRF protection
|
// CSRF protection
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token.'));
|
$this->clientError(_('There was a problem with your session token.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -185,7 +185,15 @@ class EditgroupAction extends GroupDesignAction
|
|||||||
$description = $this->trimmed('description');
|
$description = $this->trimmed('description');
|
||||||
$location = $this->trimmed('location');
|
$location = $this->trimmed('location');
|
||||||
$aliasstring = $this->trimmed('aliases');
|
$aliasstring = $this->trimmed('aliases');
|
||||||
$join_policy = intval($this->arg('join_policy'));
|
$private = $this->boolean('private');
|
||||||
|
|
||||||
|
if ($private) {
|
||||||
|
$force_scope = 1;
|
||||||
|
$join_policy = User_group::JOIN_POLICY_MODERATE;
|
||||||
|
} else {
|
||||||
|
$force_scope = 0;
|
||||||
|
$join_policy = User_group::JOIN_POLICY_OPEN;
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->nicknameExists($nickname)) {
|
if ($this->nicknameExists($nickname)) {
|
||||||
// TRANS: Group edit form validation error.
|
// TRANS: Group edit form validation error.
|
||||||
@ -267,6 +275,7 @@ class EditgroupAction extends GroupDesignAction
|
|||||||
$this->group->location = $location;
|
$this->group->location = $location;
|
||||||
$this->group->mainpage = common_local_url('showgroup', array('nickname' => $nickname));
|
$this->group->mainpage = common_local_url('showgroup', array('nickname' => $nickname));
|
||||||
$this->group->join_policy = $join_policy;
|
$this->group->join_policy = $join_policy;
|
||||||
|
$this->group->force_scope = $force_scope;
|
||||||
|
|
||||||
$result = $this->group->update($orig);
|
$result = $this->group->update($orig);
|
||||||
|
|
||||||
|
333
actions/editpeopletag.php
Normal file
333
actions/editpeopletag.php
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Edit an existing group
|
||||||
|
*
|
||||||
|
* 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 Group
|
||||||
|
* @package StatusNet
|
||||||
|
* @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') && !defined('LACONICA')) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new group
|
||||||
|
*
|
||||||
|
* This is the form for adding a new group
|
||||||
|
*
|
||||||
|
* @category Group
|
||||||
|
* @package StatusNet
|
||||||
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||||
|
* @link http://status.net/
|
||||||
|
*/
|
||||||
|
|
||||||
|
class EditpeopletagAction extends OwnerDesignAction
|
||||||
|
{
|
||||||
|
var $msg, $confirm, $confirm_args=array();
|
||||||
|
|
||||||
|
function title()
|
||||||
|
{
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $this->boolean('delete')) {
|
||||||
|
// TRANS: Title for edit list page after deleting a tag.
|
||||||
|
// TRANS: %s is a list.
|
||||||
|
return sprintf(_('Delete %s list'), $this->peopletag->tag);
|
||||||
|
}
|
||||||
|
// TRANS: Title for edit list page.
|
||||||
|
// TRANS: %s is a list.
|
||||||
|
return sprintf(_('Edit list %s'), $this->peopletag->tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare to run
|
||||||
|
*/
|
||||||
|
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
|
||||||
|
if (!common_logged_in()) {
|
||||||
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
|
$this->clientError(_('Not logged in.'));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = $this->arg('id');
|
||||||
|
$tagger_arg = $this->arg('tagger');
|
||||||
|
$tag_arg = $this->arg('tag');
|
||||||
|
|
||||||
|
$tagger = common_canonical_nickname($tagger_arg);
|
||||||
|
$tag = common_canonical_tag($tag_arg);
|
||||||
|
|
||||||
|
$current = common_current_user();
|
||||||
|
|
||||||
|
// Permanent redirect on non-canonical tag
|
||||||
|
|
||||||
|
if ($tagger_arg != $tagger || $tag_arg != $tag) {
|
||||||
|
$args = array('tagger' => $tagger, 'tag' => $tag);
|
||||||
|
common_redirect(common_local_url('editpeopletag', $args), 301);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = null;
|
||||||
|
if ($id) {
|
||||||
|
$this->peopletag = Profile_list::staticGet('id', $id);
|
||||||
|
if (!empty($this->peopletag)) {
|
||||||
|
$user = User::staticGet('id', $this->peopletag->tagger);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!$tagger) {
|
||||||
|
// TRANS: Error message displayed when trying to perform an action that requires a tagging user or ID.
|
||||||
|
$this->clientError(_('No tagger or ID.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = User::staticGet('nickname', $tagger);
|
||||||
|
$this->peopletag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->peopletag) {
|
||||||
|
// TRANS: Client error displayed when referring to a non-existing list.
|
||||||
|
$this->clientError(_('No such list.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$user) {
|
||||||
|
// This should not be happening
|
||||||
|
// TRANS: Client error displayed when referring to non-local user.
|
||||||
|
$this->clientError(_('Not a local user.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($current->id != $user->id) {
|
||||||
|
// TRANS: Client error displayed when reting to edit a tag that was not self-created.
|
||||||
|
$this->clientError(_('You must be the creator of the tag to edit it.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tagger = $user->getProfile();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the request
|
||||||
|
*
|
||||||
|
* On GET, show the form. On POST, try to save the group.
|
||||||
|
*
|
||||||
|
* @param array $args unused
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
$this->trySave();
|
||||||
|
} else {
|
||||||
|
$this->showForm();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showConfirm($msg=null, $fwd=null)
|
||||||
|
{
|
||||||
|
$this->confirm = $msg;
|
||||||
|
$this->confirm_args = $fwd;
|
||||||
|
$this->showPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showConfirmForm()
|
||||||
|
{
|
||||||
|
$this->elementStart('form', array('id' => 'form_peopletag_edit_confirm',
|
||||||
|
'class' => 'form_settings',
|
||||||
|
'method' => 'post',
|
||||||
|
'action' => common_local_url('editpeopletag',
|
||||||
|
array('tagger' => $this->tagger->nickname,
|
||||||
|
'tag' => $this->peopletag->tag))));
|
||||||
|
$this->elementStart('fieldset');
|
||||||
|
$this->hidden('token', common_session_token());
|
||||||
|
$this->hidden('id', $this->arg('id'));
|
||||||
|
|
||||||
|
foreach ($this->confirm_args as $key => $val) {
|
||||||
|
$this->hidden($key, $val);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->submit('form_action-no',
|
||||||
|
_m('BUTTON','No'),
|
||||||
|
'submit form_action-primary',
|
||||||
|
'cancel');
|
||||||
|
$this->submit('form_action-yes',
|
||||||
|
_m('BUTTON','Yes'),
|
||||||
|
'submit form_action-secondary',
|
||||||
|
'confirm');
|
||||||
|
$this->elementEnd('fieldset');
|
||||||
|
$this->elementEnd('form');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showForm($msg=null)
|
||||||
|
{
|
||||||
|
$this->msg = $msg;
|
||||||
|
$this->showPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showObjectNav()
|
||||||
|
{
|
||||||
|
$nav = new PeopletagGroupNav($this, $this->peopletag);
|
||||||
|
$nav->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showContent()
|
||||||
|
{
|
||||||
|
if ($this->confirm) {
|
||||||
|
$this->showConfirmForm();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new PeopletagEditForm($this, $this->peopletag);
|
||||||
|
$form->show();
|
||||||
|
|
||||||
|
$form->showProfileList();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPageNotice()
|
||||||
|
{
|
||||||
|
if ($this->msg) {
|
||||||
|
$this->element('p', 'error', $this->msg);
|
||||||
|
} else if ($this->confirm) {
|
||||||
|
$this->element('p', 'instructions', $this->confirm);
|
||||||
|
} else {
|
||||||
|
$this->element('p', 'instructions',
|
||||||
|
// TRANS: Form instruction for edit list form.
|
||||||
|
_('Use this form to edit the list.'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showScripts()
|
||||||
|
{
|
||||||
|
parent::showScripts();
|
||||||
|
$this->autofocus('tag');
|
||||||
|
}
|
||||||
|
|
||||||
|
function trySave()
|
||||||
|
{
|
||||||
|
$tag = common_canonical_tag($this->trimmed('tag'));
|
||||||
|
$description = $this->trimmed('description');
|
||||||
|
$private = $this->boolean('private');
|
||||||
|
$delete = $this->arg('delete');
|
||||||
|
$confirm = $this->arg('confirm');
|
||||||
|
$cancel = $this->arg('cancel');
|
||||||
|
|
||||||
|
if ($delete && $cancel) {
|
||||||
|
// TRANS: Form validation error displayed if the form data for deleting a tag was incorrect.
|
||||||
|
$this->showForm(_('Delete aborted.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$set_private = $private && $this->peopletag->private != $private;
|
||||||
|
|
||||||
|
if ($delete && !$confirm) {
|
||||||
|
// TRANS: Text in confirmation dialog for deleting a tag.
|
||||||
|
$this->showConfirm(_('Deleting this tag will permanantly remove ' .
|
||||||
|
'all its subscription and membership records. ' .
|
||||||
|
'Do you still want to continue?'), array('delete' => 1));
|
||||||
|
return;
|
||||||
|
} else if (common_valid_tag($tag)) {
|
||||||
|
// TRANS: Form validation error displayed if a given tag is invalid.
|
||||||
|
$this->showForm(_('Invalid tag.'));
|
||||||
|
return;
|
||||||
|
} else if ($tag != $this->peopletag->tag && $this->tagExists($tag)) {
|
||||||
|
// TRANS: Form validation error displayed if a given tag is already present.
|
||||||
|
// TRANS: %s is the already present tag.
|
||||||
|
$this->showForm(sprintf(_('You already have a tag named %s.'), $tag));
|
||||||
|
return;
|
||||||
|
} else if (Profile_list::descriptionTooLong($description)) {
|
||||||
|
$this->showForm(sprintf(
|
||||||
|
// TRANS: Client error shown when providing too long a description when editing a list.
|
||||||
|
// TRANS: %d is the maximum number of allowed characters.
|
||||||
|
_m('Description is too long (maximum %d character).',
|
||||||
|
'Description is too long (maximum %d characters).',
|
||||||
|
Profile_list::maxDescription()),
|
||||||
|
Profile_list::maxDescription()));
|
||||||
|
return;
|
||||||
|
} else if ($set_private && !$confirm && !$cancel) {
|
||||||
|
$fwd = array('tag' => $tag,
|
||||||
|
'description' => $description,
|
||||||
|
'private' => (int) $private);
|
||||||
|
|
||||||
|
// TRANS: Text in confirmation dialog for setting a tag from public to private.
|
||||||
|
$this->showConfirm(_('Setting a public tag as private will ' .
|
||||||
|
'permanently remove all the existing ' .
|
||||||
|
'subscriptions to it. Do you still want to continue?'), $fwd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->peopletag->query('BEGIN');
|
||||||
|
|
||||||
|
$orig = clone($this->peopletag);
|
||||||
|
|
||||||
|
$this->peopletag->tag = $tag;
|
||||||
|
$this->peopletag->description = $description;
|
||||||
|
if (!$set_private || $confirm) {
|
||||||
|
$this->peopletag->private = $private;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->peopletag->update($orig);
|
||||||
|
|
||||||
|
if (!$result) {
|
||||||
|
common_log_db_error($this->group, 'UPDATE', __FILE__);
|
||||||
|
// TRANS: TRANS: Server error displayed when updating a list fails.
|
||||||
|
$this->serverError(_('Could not update list.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->peopletag->query('COMMIT');
|
||||||
|
|
||||||
|
if ($set_private && $confirm) {
|
||||||
|
Profile_tag_subscription::cleanup($this->peopletag);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($delete) {
|
||||||
|
// This might take quite a bit of time.
|
||||||
|
$this->peopletag->delete();
|
||||||
|
// send home.
|
||||||
|
common_redirect(common_local_url('all',
|
||||||
|
array('nickname' => $this->tagger->nickname)),
|
||||||
|
303);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($tag != $orig->tag) {
|
||||||
|
common_redirect(common_local_url('editpeopletag',
|
||||||
|
array('tagger' => $this->tagger->nickname,
|
||||||
|
'tag' => $tag)),
|
||||||
|
303);
|
||||||
|
} else {
|
||||||
|
// TRANS: Edit list form success message.
|
||||||
|
$this->showForm(_('Options saved.'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function tagExists($tag)
|
||||||
|
{
|
||||||
|
$args = array('tagger' => $this->tagger->id, 'tag' => $tag);
|
||||||
|
$ptag = Profile_list::pkeyGet($args);
|
||||||
|
|
||||||
|
return !empty($ptag);
|
||||||
|
}
|
||||||
|
}
|
@ -207,45 +207,45 @@ class EmailsettingsAction extends SettingsAction
|
|||||||
$this->elementStart('ul', 'form_data');
|
$this->elementStart('ul', 'form_data');
|
||||||
|
|
||||||
if (Event::handle('StartEmailFormData', array($this))) {
|
if (Event::handle('StartEmailFormData', array($this))) {
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
$this->checkbox('emailnotifysub',
|
$this->checkbox('emailnotifysub',
|
||||||
// TRANS: Checkbox label in e-mail preferences form.
|
// TRANS: Checkbox label in e-mail preferences form.
|
||||||
_('Send me notices of new subscriptions through email.'),
|
_('Send me notices of new subscriptions through email.'),
|
||||||
$user->emailnotifysub);
|
$user->emailnotifysub);
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
$this->checkbox('emailnotifyfav',
|
$this->checkbox('emailnotifyfav',
|
||||||
// TRANS: Checkbox label in e-mail preferences form.
|
// TRANS: Checkbox label in e-mail preferences form.
|
||||||
_('Send me email when someone '.
|
_('Send me email when someone '.
|
||||||
'adds my notice as a favorite.'),
|
'adds my notice as a favorite.'),
|
||||||
$user->emailnotifyfav);
|
$user->emailnotifyfav);
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
$this->checkbox('emailnotifymsg',
|
$this->checkbox('emailnotifymsg',
|
||||||
// TRANS: Checkbox label in e-mail preferences form.
|
// TRANS: Checkbox label in e-mail preferences form.
|
||||||
_('Send me email when someone sends me a private message.'),
|
_('Send me email when someone sends me a private message.'),
|
||||||
$user->emailnotifymsg);
|
$user->emailnotifymsg);
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
$this->checkbox('emailnotifyattn',
|
$this->checkbox('emailnotifyattn',
|
||||||
// TRANS: Checkbox label in e-mail preferences form.
|
// TRANS: Checkbox label in e-mail preferences form.
|
||||||
_('Send me email when someone sends me an "@-reply".'),
|
_('Send me email when someone sends me an "@-reply".'),
|
||||||
$user->emailnotifyattn);
|
$user->emailnotifyattn);
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
$this->checkbox('emailnotifynudge',
|
$this->checkbox('emailnotifynudge',
|
||||||
// TRANS: Checkbox label in e-mail preferences form.
|
// TRANS: Checkbox label in e-mail preferences form.
|
||||||
_('Allow friends to nudge me and send me an email.'),
|
_('Allow friends to nudge me and send me an email.'),
|
||||||
$user->emailnotifynudge);
|
$user->emailnotifynudge);
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
$this->checkbox('emailmicroid',
|
$this->checkbox('emailmicroid',
|
||||||
// TRANS: Checkbox label in e-mail preferences form.
|
// TRANS: Checkbox label in e-mail preferences form.
|
||||||
_('Publish a MicroID for my email address.'),
|
_('Publish a MicroID for my email address.'),
|
||||||
$user->emailmicroid);
|
$user->emailmicroid);
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
Event::handle('EndEmailFormData', array($this));
|
Event::handle('EndEmailFormData', array($this));
|
||||||
}
|
}
|
||||||
$this->elementEnd('ul');
|
$this->elementEnd('ul');
|
||||||
// TRANS: Button label to save e-mail preferences.
|
// TRANS: Button label to save e-mail preferences.
|
||||||
$this->submit('save', _m('BUTTON','Save'));
|
$this->submit('save', _m('BUTTON','Save'));
|
||||||
@ -289,6 +289,7 @@ class EmailsettingsAction extends SettingsAction
|
|||||||
// CSRF protection
|
// CSRF protection
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->show_form(_('There was a problem with your session token. '.
|
$this->show_form(_('There was a problem with your session token. '.
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
return;
|
return;
|
||||||
@ -319,48 +320,47 @@ class EmailsettingsAction extends SettingsAction
|
|||||||
*/
|
*/
|
||||||
function savePreferences()
|
function savePreferences()
|
||||||
{
|
{
|
||||||
$user = common_current_user();
|
$user = common_current_user();
|
||||||
|
|
||||||
if (Event::handle('StartEmailSaveForm', array($this, &$user))) {
|
if (Event::handle('StartEmailSaveForm', array($this, &$user))) {
|
||||||
|
$emailnotifysub = $this->boolean('emailnotifysub');
|
||||||
|
$emailnotifyfav = $this->boolean('emailnotifyfav');
|
||||||
|
$emailnotifymsg = $this->boolean('emailnotifymsg');
|
||||||
|
$emailnotifynudge = $this->boolean('emailnotifynudge');
|
||||||
|
$emailnotifyattn = $this->boolean('emailnotifyattn');
|
||||||
|
$emailmicroid = $this->boolean('emailmicroid');
|
||||||
|
$emailpost = $this->boolean('emailpost');
|
||||||
|
|
||||||
$emailnotifysub = $this->boolean('emailnotifysub');
|
assert(!is_null($user)); // should already be checked
|
||||||
$emailnotifyfav = $this->boolean('emailnotifyfav');
|
|
||||||
$emailnotifymsg = $this->boolean('emailnotifymsg');
|
|
||||||
$emailnotifynudge = $this->boolean('emailnotifynudge');
|
|
||||||
$emailnotifyattn = $this->boolean('emailnotifyattn');
|
|
||||||
$emailmicroid = $this->boolean('emailmicroid');
|
|
||||||
$emailpost = $this->boolean('emailpost');
|
|
||||||
|
|
||||||
assert(!is_null($user)); // should already be checked
|
$user->query('BEGIN');
|
||||||
|
|
||||||
$user->query('BEGIN');
|
$original = clone($user);
|
||||||
|
|
||||||
$original = clone($user);
|
$user->emailnotifysub = $emailnotifysub;
|
||||||
|
$user->emailnotifyfav = $emailnotifyfav;
|
||||||
|
$user->emailnotifymsg = $emailnotifymsg;
|
||||||
|
$user->emailnotifynudge = $emailnotifynudge;
|
||||||
|
$user->emailnotifyattn = $emailnotifyattn;
|
||||||
|
$user->emailmicroid = $emailmicroid;
|
||||||
|
$user->emailpost = $emailpost;
|
||||||
|
|
||||||
$user->emailnotifysub = $emailnotifysub;
|
$result = $user->update($original);
|
||||||
$user->emailnotifyfav = $emailnotifyfav;
|
|
||||||
$user->emailnotifymsg = $emailnotifymsg;
|
|
||||||
$user->emailnotifynudge = $emailnotifynudge;
|
|
||||||
$user->emailnotifyattn = $emailnotifyattn;
|
|
||||||
$user->emailmicroid = $emailmicroid;
|
|
||||||
$user->emailpost = $emailpost;
|
|
||||||
|
|
||||||
$result = $user->update($original);
|
if ($result === false) {
|
||||||
|
common_log_db_error($user, 'UPDATE', __FILE__);
|
||||||
|
// TRANS: Server error thrown on database error updating e-mail preferences.
|
||||||
|
$this->serverError(_('Could not update user.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ($result === false) {
|
$user->query('COMMIT');
|
||||||
common_log_db_error($user, 'UPDATE', __FILE__);
|
|
||||||
// TRANS: Server error thrown on database error updating e-mail preferences.
|
|
||||||
$this->serverError(_('Could not update user.'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$user->query('COMMIT');
|
Event::handle('EndEmailSaveForm', array($this));
|
||||||
|
|
||||||
Event::handle('EndEmailSaveForm', array($this));
|
// TRANS: Confirmation message for successful e-mail preferences save.
|
||||||
|
$this->showForm(_('Email preferences saved.'), true);
|
||||||
// TRANS: Confirmation message for successful e-mail preferences save.
|
}
|
||||||
$this->showForm(_('Email preferences saved.'), true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -404,24 +404,29 @@ class EmailsettingsAction extends SettingsAction
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$confirm = new Confirm_address();
|
if (Event::handle('StartAddEmailAddress', array($user, $email))) {
|
||||||
|
|
||||||
$confirm->address = $email;
|
$confirm = new Confirm_address();
|
||||||
$confirm->address_type = 'email';
|
|
||||||
$confirm->user_id = $user->id;
|
|
||||||
$confirm->code = common_confirmation_code(64);
|
|
||||||
|
|
||||||
$result = $confirm->insert();
|
$confirm->address = $email;
|
||||||
|
$confirm->address_type = 'email';
|
||||||
|
$confirm->user_id = $user->id;
|
||||||
|
$confirm->code = common_confirmation_code(64);
|
||||||
|
|
||||||
if ($result === false) {
|
$result = $confirm->insert();
|
||||||
common_log_db_error($confirm, 'INSERT', __FILE__);
|
|
||||||
// TRANS: Server error thrown on database error adding e-mail confirmation code.
|
if ($result === false) {
|
||||||
$this->serverError(_('Could not insert confirmation code.'));
|
common_log_db_error($confirm, 'INSERT', __FILE__);
|
||||||
return;
|
// TRANS: Server error thrown on database error adding e-mail confirmation code.
|
||||||
|
$this->serverError(_('Could not insert confirmation code.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mail_confirm_address($user, $confirm->code, $user->nickname, $email);
|
||||||
|
|
||||||
|
Event::handle('EndAddEmailAddress', array($user, $email));
|
||||||
}
|
}
|
||||||
|
|
||||||
mail_confirm_address($user, $confirm->code, $user->nickname, $email);
|
|
||||||
|
|
||||||
// TRANS: Message given saving valid e-mail address that is to be confirmed.
|
// TRANS: Message given saving valid e-mail address that is to be confirmed.
|
||||||
$msg = _('A confirmation code was sent to the email address you added. '.
|
$msg = _('A confirmation code was sent to the email address you added. '.
|
||||||
'Check your inbox (and spam box!) for the code and instructions '.
|
'Check your inbox (and spam box!) for the code and instructions '.
|
||||||
|
@ -58,7 +58,7 @@ class FavorAction extends Action
|
|||||||
{
|
{
|
||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed when trying to mark a notice as favorite without being logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -72,6 +72,7 @@ class FavorAction extends Action
|
|||||||
$notice = Notice::staticGet($id);
|
$notice = Notice::staticGet($id);
|
||||||
$token = $this->trimmed('token-'.$notice->id);
|
$token = $this->trimmed('token-'.$notice->id);
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ class FoafAction extends Action
|
|||||||
$this->profile = $this->user->getProfile();
|
$this->profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (!$this->profile) {
|
if (!$this->profile) {
|
||||||
// TRANS: Server error displayed when requesting Friends of a Friend feed for a user for which the profile could not be found.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->serverError(_('User has no profile.'), 500);
|
$this->serverError(_('User has no profile.'), 500);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,7 @@ class GeocodeAction extends Action
|
|||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token. '.
|
$this->clientError(_('There was a problem with your session token. '.
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
}
|
}
|
||||||
|
@ -56,12 +56,13 @@ class GroupblockAction extends RedirectingAction
|
|||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed trying to block a user from a group while not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (empty($token) || $token != common_session_token()) {
|
if (empty($token) || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -180,8 +180,8 @@ class GrouplogoAction extends GroupDesignAction
|
|||||||
|
|
||||||
if (!$profile) {
|
if (!$profile) {
|
||||||
common_log_db_error($user, 'SELECT', __FILE__);
|
common_log_db_error($user, 'SELECT', __FILE__);
|
||||||
// TRANS: Server error displayed coming across a request from a user without a profile.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->serverError(_('User without matching profile.'));
|
$this->serverError(_('User has no profile.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,11 +156,12 @@ class GroupqueueAction extends GroupDesignAction
|
|||||||
$members->free();
|
$members->free();
|
||||||
|
|
||||||
$this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
|
$this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
|
||||||
$this->page, 'groupmembers',
|
$this->page, 'groupqueue',
|
||||||
array('nickname' => $this->group->nickname));
|
array('nickname' => $this->group->nickname));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @todo FIXME: documentation missing.
|
||||||
class GroupQueueList extends GroupMemberList
|
class GroupQueueList extends GroupMemberList
|
||||||
{
|
{
|
||||||
function newListItem($profile)
|
function newListItem($profile)
|
||||||
@ -169,6 +170,7 @@ class GroupQueueList extends GroupMemberList
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @todo FIXME: documentation missing.
|
||||||
class GroupQueueListItem extends GroupMemberListItem
|
class GroupQueueListItem extends GroupMemberListItem
|
||||||
{
|
{
|
||||||
function showActions()
|
function showActions()
|
||||||
|
@ -137,7 +137,7 @@ class groupRssAction extends Rss10Action
|
|||||||
// TRANS: Message is used as link title. %s is a user nickname.
|
// TRANS: Message is used as link title. %s is a user nickname.
|
||||||
'title' => sprintf(_('%s timeline'), $group->nickname),
|
'title' => sprintf(_('%s timeline'), $group->nickname),
|
||||||
'link' => common_local_url('showgroup', array('nickname' => $group->nickname)),
|
'link' => common_local_url('showgroup', array('nickname' => $group->nickname)),
|
||||||
// TRANS: Message is used as link description. %1$s is a username, %2$s is a site name.
|
// TRANS: Message is used as link description. %1$s is a group name, %2$s is a site name.
|
||||||
'description' => sprintf(_('Updates from members of %1$s on %2$s!'),
|
'description' => sprintf(_('Updates from members of %1$s on %2$s!'),
|
||||||
$group->nickname, common_config('site', 'name')));
|
$group->nickname, common_config('site', 'name')));
|
||||||
return $c;
|
return $c;
|
||||||
|
@ -56,12 +56,13 @@ class GroupunblockAction extends Action
|
|||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed when trying to unblock a user from a group while not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (empty($token) || $token != common_session_token()) {
|
if (empty($token) || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ class HcardAction extends Action
|
|||||||
$this->profile = $this->user->getProfile();
|
$this->profile = $this->user->getProfile();
|
||||||
|
|
||||||
if (!$this->profile) {
|
if (!$this->profile) {
|
||||||
// TRANS: Server error displayed when trying to get a user hCard for a user without a profile.
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
$this->serverError(_('User has no profile.'));
|
$this->serverError(_('User has no profile.'));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -240,6 +240,7 @@ class ImsettingsAction extends SettingsAction
|
|||||||
// CSRF protection
|
// CSRF protection
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->showForm(_('There was a problem with your session token. '.
|
$this->showForm(_('There was a problem with your session token. '.
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
return;
|
return;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
* StatusNet - the distributed open-source microblogging tool
|
||||||
* Copyright (C) 2008, 2009, StatusNet, Inc.
|
* Copyright (C) 2008-2011, StatusNet, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
@ -28,6 +28,11 @@ class InviteAction extends CurrentUserDesignAction
|
|||||||
var $subbed = null;
|
var $subbed = null;
|
||||||
var $sent = null;
|
var $sent = null;
|
||||||
|
|
||||||
|
function showNoticeForm()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
function isReadOnly($args)
|
function isReadOnly($args)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -54,54 +59,77 @@ class InviteAction extends CurrentUserDesignAction
|
|||||||
|
|
||||||
function sendInvitations()
|
function sendInvitations()
|
||||||
{
|
{
|
||||||
// CSRF protection
|
if (Event::handle('StartSendInvitations', array(&$this))) {
|
||||||
$token = $this->trimmed('token');
|
// CSRF protection
|
||||||
if (!$token || $token != common_session_token()) {
|
$token = $this->trimmed('token');
|
||||||
$this->showForm(_('There was a problem with your session token. Try again, please.'));
|
if (!$token || $token != common_session_token()) {
|
||||||
return;
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
}
|
$this->showForm(_('There was a problem with your session token. Try again, please.'));
|
||||||
|
|
||||||
$user = common_current_user();
|
|
||||||
$profile = $user->getProfile();
|
|
||||||
|
|
||||||
$bestname = $profile->getBestName();
|
|
||||||
$sitename = common_config('site', 'name');
|
|
||||||
$personal = $this->trimmed('personal');
|
|
||||||
|
|
||||||
$addresses = explode("\n", $this->trimmed('addresses'));
|
|
||||||
|
|
||||||
foreach ($addresses as $email) {
|
|
||||||
$email = trim($email);
|
|
||||||
if (!Validate::email($email, common_config('email', 'check_domain'))) {
|
|
||||||
// TRANS: Form validation message when providing an e-mail address that does not validate.
|
|
||||||
// TRANS: %s is an invalid e-mail address.
|
|
||||||
$this->showForm(sprintf(_('Invalid email address: %s.'), $email));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$this->already = array();
|
$user = common_current_user();
|
||||||
$this->subbed = array();
|
$profile = $user->getProfile();
|
||||||
|
|
||||||
foreach ($addresses as $email) {
|
$bestname = $profile->getBestName();
|
||||||
$email = common_canonical_email($email);
|
$sitename = common_config('site', 'name');
|
||||||
$other = User::staticGet('email', $email);
|
$personal = $this->trimmed('personal');
|
||||||
if ($other) {
|
|
||||||
if ($user->isSubscribed($other)) {
|
$addresses = explode("\n", $this->trimmed('addresses'));
|
||||||
$this->already[] = $other;
|
foreach ($addresses as $email) {
|
||||||
} else {
|
$email = trim($email);
|
||||||
subs_subscribe_to($user, $other);
|
$valid = null;
|
||||||
$this->subbed[] = $other;
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (Event::handle('StartValidateUserEmail', array(null, $email, &$valid))) {
|
||||||
|
$valid = Validate::email($email, common_config('email', 'check_domain'));
|
||||||
|
Event::handle('EndValidateUserEmail', array(null, $email, &$valid));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($valid) {
|
||||||
|
if (Event::handle('StartValidateEmailInvite', array($user, $email, &$valid))) {
|
||||||
|
$valid = true;
|
||||||
|
Event::handle('EndValidateEmailInvite', array($user, $email, &$valid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$valid) {
|
||||||
|
// TRANS: Form validation message when providing an e-mail address that does not validate.
|
||||||
|
// TRANS: %s is an invalid e-mail address.
|
||||||
|
$this->showForm(sprintf(_('Invalid email address: %s.'), $email));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (ClientException $e) {
|
||||||
|
$this->showForm($e->getMessage());
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$this->sent[] = $email;
|
|
||||||
$this->sendInvitation($email, $user, $personal);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->already = array();
|
||||||
|
$this->subbed = array();
|
||||||
|
|
||||||
|
foreach ($addresses as $email) {
|
||||||
|
$email = common_canonical_email($email);
|
||||||
|
$other = User::staticGet('email', $email);
|
||||||
|
if ($other) {
|
||||||
|
if ($user->isSubscribed($other)) {
|
||||||
|
$this->already[] = $other;
|
||||||
|
} else {
|
||||||
|
subs_subscribe_to($user, $other);
|
||||||
|
$this->subbed[] = $other;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->sent[] = $email;
|
||||||
|
$this->sendInvitation($email, $user, $personal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->mode = 'sent';
|
||||||
|
|
||||||
|
$this->showPage();
|
||||||
|
Event::handle('EndSendInvitations', array($this));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->mode = 'sent';
|
|
||||||
|
|
||||||
$this->showPage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function showScripts()
|
function showScripts()
|
||||||
@ -132,50 +160,53 @@ class InviteAction extends CurrentUserDesignAction
|
|||||||
|
|
||||||
function showInvitationSuccess()
|
function showInvitationSuccess()
|
||||||
{
|
{
|
||||||
if ($this->already) {
|
if (Event::handle('StartShowInvitationSuccess', array($this))) {
|
||||||
// TRANS: Message displayed inviting users to use a StatusNet site while the inviting user
|
if ($this->already) {
|
||||||
// TRANS: is already subscribed to one or more users with the given e-mail address(es).
|
// TRANS: Message displayed inviting users to use a StatusNet site while the inviting user
|
||||||
// TRANS: Plural form is based on the number of reported already subscribed e-mail addresses.
|
// TRANS: is already subscribed to one or more users with the given e-mail address(es).
|
||||||
// TRANS: Followed by a bullet list.
|
// TRANS: Plural form is based on the number of reported already subscribed e-mail addresses.
|
||||||
$this->element('p', null, _m('You are already subscribed to this user:',
|
// TRANS: Followed by a bullet list.
|
||||||
'You are already subscribed to these users:',
|
$this->element('p', null, _m('You are already subscribed to this user:',
|
||||||
count($this->already)));
|
'You are already subscribed to these users:',
|
||||||
$this->elementStart('ul');
|
count($this->already)));
|
||||||
foreach ($this->already as $other) {
|
$this->elementStart('ul');
|
||||||
// TRANS: Used as list item for already subscribed users (%1$s is nickname, %2$s is e-mail address).
|
foreach ($this->already as $other) {
|
||||||
$this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
|
// TRANS: Used as list item for already subscribed users (%1$s is nickname, %2$s is e-mail address).
|
||||||
|
$this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
|
||||||
|
}
|
||||||
|
$this->elementEnd('ul');
|
||||||
}
|
}
|
||||||
$this->elementEnd('ul');
|
if ($this->subbed) {
|
||||||
}
|
// TRANS: Message displayed inviting users to use a StatusNet site while the invited user
|
||||||
if ($this->subbed) {
|
// TRANS: already uses a this StatusNet site. Plural form is based on the number of
|
||||||
// TRANS: Message displayed inviting users to use a StatusNet site while the invited user
|
// TRANS: reported already present people. Followed by a bullet list.
|
||||||
// TRANS: already uses a this StatusNet site. Plural form is based on the number of
|
$this->element('p', null, _m('This person is already a user and you were automatically subscribed:',
|
||||||
// TRANS: reported already present people. Followed by a bullet list.
|
'These people are already users and you were automatically subscribed to them:',
|
||||||
$this->element('p', null, _m('This person is already a user and you were automatically subscribed:',
|
count($this->subbed)));
|
||||||
'These people are already users and you were automatically subscribed to them:',
|
$this->elementStart('ul');
|
||||||
count($this->subbed)));
|
foreach ($this->subbed as $other) {
|
||||||
$this->elementStart('ul');
|
// TRANS: Used as list item for already registered people (%1$s is nickname, %2$s is e-mail address).
|
||||||
foreach ($this->subbed as $other) {
|
$this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
|
||||||
// TRANS: Used as list item for already registered people (%1$s is nickname, %2$s is e-mail address).
|
}
|
||||||
$this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
|
$this->elementEnd('ul');
|
||||||
}
|
}
|
||||||
$this->elementEnd('ul');
|
if ($this->sent) {
|
||||||
}
|
// TRANS: Message displayed inviting users to use a StatusNet site. Plural form is
|
||||||
if ($this->sent) {
|
// TRANS: based on the number of invitations sent. Followed by a bullet list of
|
||||||
// TRANS: Message displayed inviting users to use a StatusNet site. Plural form is
|
// TRANS: e-mail addresses to which invitations were sent.
|
||||||
// TRANS: based on the number of invitations sent. Followed by a bullet list of
|
$this->element('p', null, _m('Invitation sent to the following person:',
|
||||||
// TRANS: e-mail addresses to which invitations were sent.
|
'Invitations sent to the following people:',
|
||||||
$this->element('p', null, _m('Invitation sent to the following person:',
|
count($this->sent)));
|
||||||
'Invitations sent to the following people:',
|
$this->elementStart('ul');
|
||||||
count($this->sent)));
|
foreach ($this->sent as $other) {
|
||||||
$this->elementStart('ul');
|
$this->element('li', null, $other);
|
||||||
foreach ($this->sent as $other) {
|
}
|
||||||
$this->element('li', null, $other);
|
$this->elementEnd('ul');
|
||||||
|
// TRANS: Generic message displayed after sending out one or more invitations to
|
||||||
|
// TRANS: people to join a StatusNet site.
|
||||||
|
$this->element('p', null, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
|
||||||
}
|
}
|
||||||
$this->elementEnd('ul');
|
Event::handle('EndShowInvitationSuccess', array($this));
|
||||||
// TRANS: Generic message displayed after sending out one or more invitations to
|
|
||||||
// TRANS: people to join a StatusNet site.
|
|
||||||
$this->element('p', null, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,35 +234,11 @@ class InviteAction extends CurrentUserDesignAction
|
|||||||
|
|
||||||
function showInviteForm()
|
function showInviteForm()
|
||||||
{
|
{
|
||||||
$this->elementStart('form', array('method' => 'post',
|
if (Event::handle('StartShowInviteForm', array($this))) {
|
||||||
'id' => 'form_invite',
|
$form = new InviteForm($this);
|
||||||
'class' => 'form_settings',
|
$form->show();
|
||||||
'action' => common_local_url('invite')));
|
Event::handle('EndShowInviteForm', array($this));
|
||||||
$this->elementStart('fieldset');
|
}
|
||||||
// TRANS: Form legend.
|
|
||||||
$this->element('legend', null, 'Send an invitation');
|
|
||||||
$this->hidden('token', common_session_token());
|
|
||||||
|
|
||||||
$this->elementStart('ul', 'form_data');
|
|
||||||
$this->elementStart('li');
|
|
||||||
// TRANS: Field label for a list of e-mail addresses.
|
|
||||||
$this->textarea('addresses', _('Email addresses'),
|
|
||||||
$this->trimmed('addresses'),
|
|
||||||
// TRANS: Tooltip for field label for a list of e-mail addresses.
|
|
||||||
_('Addresses of friends to invite (one per line).'));
|
|
||||||
$this->elementEnd('li');
|
|
||||||
$this->elementStart('li');
|
|
||||||
// TRANS: Field label for a personal message to send to invitees.
|
|
||||||
$this->textarea('personal', _('Personal message'),
|
|
||||||
$this->trimmed('personal'),
|
|
||||||
// TRANS: Tooltip for field label for a personal message to send to invitees.
|
|
||||||
_('Optionally add a personal message to the invitation.'));
|
|
||||||
$this->elementEnd('li');
|
|
||||||
$this->elementEnd('ul');
|
|
||||||
// TRANS: Send button for inviting friends
|
|
||||||
$this->submit('send', _m('BUTTON', 'Send'));
|
|
||||||
$this->elementEnd('fieldset');
|
|
||||||
$this->elementEnd('form');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendInvitation($email, $user, $personal)
|
function sendInvitation($email, $user, $personal)
|
||||||
@ -254,44 +261,31 @@ class InviteAction extends CurrentUserDesignAction
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$confirmUrl = common_local_url('register', array('code' => $invite->code));
|
||||||
|
|
||||||
$recipients = array($email);
|
$recipients = array($email);
|
||||||
|
|
||||||
$headers['From'] = mail_notify_from();
|
$headers['From'] = mail_notify_from();
|
||||||
$headers['To'] = trim($email);
|
$headers['To'] = trim($email);
|
||||||
|
$headers['Content-Type'] = 'text/html; charset=UTF-8';
|
||||||
|
|
||||||
// TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral
|
// TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral
|
||||||
// TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, $2$s is
|
// TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, $2$s is
|
||||||
// TRANS: the StatusNet sitename.
|
// TRANS: the StatusNet sitename.
|
||||||
$headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
|
$headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
|
||||||
|
|
||||||
// TRANS: Body text for invitation email. Note that 'them' is correct as a gender-neutral
|
$title = (empty($personal)) ? 'invite' : 'invitepersonal';
|
||||||
// TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, %2$s is the
|
|
||||||
// TRANS: StatusNet sitename, %3$s is the site URL, %4$s is the personal message from the
|
// @todo FIXME: i18n issue.
|
||||||
// TRANS: inviting user, %s%5 a link to the timeline for the inviting user, %s$6 is a link
|
$inviteTemplate = DocFile::forTitle($title, DocFile::mailPaths());
|
||||||
// TRANS: to register with the StatusNet site.
|
|
||||||
$body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
|
$body = $inviteTemplate->toHTML(array('inviter' => $bestname,
|
||||||
"%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
|
'inviterurl' => $profile->profileurl,
|
||||||
"You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
|
'confirmurl' => $confirmUrl,
|
||||||
"It's also great for meeting new people who share your interests.\n\n".
|
'personal' => $personal));
|
||||||
"%1\$s said:\n\n%4\$s\n\n".
|
|
||||||
"You can see %1\$s's profile page on %2\$s here:\n\n".
|
common_debug('Confirm URL is ' . common_local_url('register', array('code' => $invite->code)));
|
||||||
"%5\$s\n\n".
|
|
||||||
"If you'd like to try the service, click on the link below to accept the invitation.\n\n".
|
|
||||||
"%6\$s\n\n".
|
|
||||||
"If not, you can ignore this message. Thanks for your patience and your time.\n\n".
|
|
||||||
"Sincerely, %2\$s\n"),
|
|
||||||
$bestname,
|
|
||||||
$sitename,
|
|
||||||
common_root_url(),
|
|
||||||
$personal,
|
|
||||||
common_local_url('showstream', array('nickname' => $user->nickname)),
|
|
||||||
common_local_url('register', array('code' => $invite->code)));
|
|
||||||
|
|
||||||
mail_send($recipients, $headers, $body);
|
mail_send($recipients, $headers, $body);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showObjectNav()
|
|
||||||
{
|
|
||||||
$nav = new SubGroupNav($this, common_current_user());
|
|
||||||
$nav->show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,7 @@ class LoginAction extends Action
|
|||||||
$this->elementStart('ul', 'form_data');
|
$this->elementStart('ul', 'form_data');
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
// TRANS: Field label on login page.
|
// TRANS: Field label on login page.
|
||||||
$this->input('nickname', _('Nickname'));
|
$this->input('nickname', _('Username or email address'));
|
||||||
$this->elementEnd('li');
|
$this->elementEnd('li');
|
||||||
$this->elementStart('li');
|
$this->elementStart('li');
|
||||||
// TRANS: Field label on login page.
|
// TRANS: Field label on login page.
|
||||||
|
@ -65,7 +65,7 @@ class LogoutAction extends Action
|
|||||||
{
|
{
|
||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed trying to log out when not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
} else {
|
} else {
|
||||||
if (Event::handle('StartLogout', array($this))) {
|
if (Event::handle('StartLogout', array($this))) {
|
||||||
|
@ -58,12 +58,13 @@ class MakeadminAction extends RedirectingAction
|
|||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed when trying to access the "make admin" page while not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (empty($token) || $token != common_session_token()) {
|
if (empty($token) || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,7 @@ class NewApplicationAction extends OwnerDesignAction
|
|||||||
// CSRF protection
|
// CSRF protection
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token.'));
|
$this->clientError(_('There was a problem with your session token.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -294,9 +295,8 @@ class NewApplicationAction extends OwnerDesignAction
|
|||||||
$app->uploadLogo();
|
$app->uploadLogo();
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$app->query('ROLLBACK');
|
$app->query('ROLLBACK');
|
||||||
// TRANS: Form validation error on New application page when providing an invalid image upload.
|
|
||||||
$this->showForm(_('Invalid image.'));
|
$this->showForm(_('Invalid image.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$app->query('COMMIT');
|
$app->query('COMMIT');
|
||||||
|
@ -130,8 +130,8 @@ class NewgroupAction extends Action
|
|||||||
$homepage = $this->trimmed('homepage');
|
$homepage = $this->trimmed('homepage');
|
||||||
$description = $this->trimmed('description');
|
$description = $this->trimmed('description');
|
||||||
$location = $this->trimmed('location');
|
$location = $this->trimmed('location');
|
||||||
|
$private = $this->boolean('private');
|
||||||
$aliasstring = $this->trimmed('aliases');
|
$aliasstring = $this->trimmed('aliases');
|
||||||
$join_policy = intval($this->arg('join_policy'));
|
|
||||||
|
|
||||||
if ($this->nicknameExists($nickname)) {
|
if ($this->nicknameExists($nickname)) {
|
||||||
// TRANS: Group create form validation error.
|
// TRANS: Group create form validation error.
|
||||||
@ -203,6 +203,14 @@ class NewgroupAction extends Action
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($private) {
|
||||||
|
$force_scope = 1;
|
||||||
|
$join_policy = User_group::JOIN_POLICY_MODERATE;
|
||||||
|
} else {
|
||||||
|
$force_scope = 0;
|
||||||
|
$join_policy = User_group::JOIN_POLICY_OPEN;
|
||||||
|
}
|
||||||
|
|
||||||
$cur = common_current_user();
|
$cur = common_current_user();
|
||||||
|
|
||||||
// Checked in prepare() above
|
// Checked in prepare() above
|
||||||
@ -217,6 +225,7 @@ class NewgroupAction extends Action
|
|||||||
'aliases' => $aliases,
|
'aliases' => $aliases,
|
||||||
'userid' => $cur->id,
|
'userid' => $cur->id,
|
||||||
'join_policy' => $join_policy,
|
'join_policy' => $join_policy,
|
||||||
|
'force_scope' => $force_scope,
|
||||||
'local' => true));
|
'local' => true));
|
||||||
|
|
||||||
$this->group = $group;
|
$this->group = $group;
|
||||||
|
@ -85,7 +85,7 @@ class NewmessageAction extends Action
|
|||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed trying to create a new direct message while not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'), 403);
|
$this->clientError(_('Not logged in.'), 403);
|
||||||
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
$this->saveNewMessage();
|
$this->saveNewMessage();
|
||||||
@ -137,6 +137,7 @@ class NewmessageAction extends Action
|
|||||||
|
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->showForm(_('There was a problem with your session token. ' .
|
$this->showForm(_('There was a problem with your session token. ' .
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
return;
|
return;
|
||||||
|
@ -64,7 +64,7 @@ class NewnoticeAction extends Action
|
|||||||
function title()
|
function title()
|
||||||
{
|
{
|
||||||
// TRANS: Page title for sending a new notice.
|
// TRANS: Page title for sending a new notice.
|
||||||
return _('New notice');
|
return _m('TITLE','New notice');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -83,7 +83,7 @@ class NewnoticeAction extends Action
|
|||||||
function handle($args)
|
function handle($args)
|
||||||
{
|
{
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed trying to send a notice while not logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
// check for this before token since all POST and FILES data
|
// check for this before token since all POST and FILES data
|
||||||
@ -101,6 +101,7 @@ class NewnoticeAction extends Action
|
|||||||
// CSRF protection
|
// CSRF protection
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token. '.
|
$this->clientError(_('There was a problem with your session token. '.
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
}
|
}
|
||||||
@ -180,6 +181,8 @@ class NewnoticeAction extends Action
|
|||||||
|
|
||||||
if (Notice::contentTooLong($content_shortened)) {
|
if (Notice::contentTooLong($content_shortened)) {
|
||||||
$upload->delete();
|
$upload->delete();
|
||||||
|
// TRANS: Client error displayed exceeding the maximum notice length.
|
||||||
|
// TRANS: %d is the maximum length for a notice.
|
||||||
$this->clientError(sprintf(_m('Maximum notice size is %d character, including attachment URL.',
|
$this->clientError(sprintf(_m('Maximum notice size is %d character, including attachment URL.',
|
||||||
'Maximum notice size is %d characters, including attachment URL.',
|
'Maximum notice size is %d characters, including attachment URL.',
|
||||||
Notice::maxContent()),
|
Notice::maxContent()),
|
||||||
@ -209,6 +212,10 @@ class NewnoticeAction extends Action
|
|||||||
$author_id = $user->id;
|
$author_id = $user->id;
|
||||||
$text = $content_shortened;
|
$text = $content_shortened;
|
||||||
|
|
||||||
|
// Does the heavy-lifting for getting "To:" information
|
||||||
|
|
||||||
|
ToSelector::fillOptions($this, $options);
|
||||||
|
|
||||||
if (Event::handle('StartNoticeSaveWeb', array($this, &$author_id, &$text, &$options))) {
|
if (Event::handle('StartNoticeSaveWeb', array($this, &$author_id, &$text, &$options))) {
|
||||||
|
|
||||||
$notice = Notice::saveNew($user->id, $content_shortened, 'web', $options);
|
$notice = Notice::saveNew($user->id, $content_shortened, 'web', $options);
|
||||||
@ -282,7 +289,8 @@ class NewnoticeAction extends Action
|
|||||||
{
|
{
|
||||||
$this->startHTML('text/xml;charset=utf-8', true);
|
$this->startHTML('text/xml;charset=utf-8', true);
|
||||||
$this->elementStart('head');
|
$this->elementStart('head');
|
||||||
$this->element('title', null, _('New notice'));
|
// TRANS: Title for form to send a new notice.
|
||||||
|
$this->element('title', null, _m('TITLE','New notice'));
|
||||||
$this->elementEnd('head');
|
$this->elementEnd('head');
|
||||||
$this->elementStart('body');
|
$this->elementStart('body');
|
||||||
|
|
||||||
@ -323,6 +331,8 @@ class NewnoticeAction extends Action
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* // XXX: Should we be showing the notice form with microapps here?
|
||||||
|
*
|
||||||
* Overload for replies or bad results
|
* Overload for replies or bad results
|
||||||
*
|
*
|
||||||
* We show content in the notice form if there were replies or results.
|
* We show content in the notice form if there were replies or results.
|
||||||
@ -344,10 +354,27 @@ class NewnoticeAction extends Action
|
|||||||
$inreplyto = null;
|
$inreplyto = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$notice_form = new NoticeForm($this, array('content' => $content,
|
$this->elementStart('div', 'input_forms');
|
||||||
'inreplyto' => $inreplyto));
|
$this->elementStart(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'id' => 'input_form_status',
|
||||||
|
'class' => 'input_form current nonav'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$notice_form = new NoticeForm(
|
||||||
|
$this,
|
||||||
|
array(
|
||||||
|
'content' => $content,
|
||||||
|
'inreplyto' => $inreplyto
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
$notice_form->show();
|
$notice_form->show();
|
||||||
|
|
||||||
|
$this->elementEnd('div');
|
||||||
|
$this->elementEnd('div');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,10 +48,36 @@ require_once INSTALLDIR.'/lib/searchaction.php';
|
|||||||
*/
|
*/
|
||||||
class NoticesearchAction extends SearchAction
|
class NoticesearchAction extends SearchAction
|
||||||
{
|
{
|
||||||
|
protected $q = null;
|
||||||
|
|
||||||
function prepare($args)
|
function prepare($args)
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
|
|
||||||
|
$this->q = $this->trimmed('q');
|
||||||
|
|
||||||
|
// FIXME: very dependent on tag format
|
||||||
|
if (preg_match('/^#([\pL\pN_\-\.]{1,64})/ue', $this->q)) {
|
||||||
|
common_redirect(common_local_url('tag',
|
||||||
|
array('tag' => common_canonical_tag(substr($this->q, 1)))),
|
||||||
|
303);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($this->q)) {
|
||||||
|
|
||||||
|
$profile = Profile::current();
|
||||||
|
$stream = new SearchNoticeStream($this->q, $profile);
|
||||||
|
$page = $this->trimmed('page');
|
||||||
|
|
||||||
|
if (empty($page)) {
|
||||||
|
$page = 1;
|
||||||
|
} else {
|
||||||
|
$page = (int)$page;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->notice = $stream->getNotices((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
|
||||||
|
}
|
||||||
|
|
||||||
common_set_returnto($this->selfUrl());
|
common_set_returnto($this->selfUrl());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -106,18 +132,25 @@ class NoticesearchAction extends SearchAction
|
|||||||
*/
|
*/
|
||||||
function showResults($q, $page)
|
function showResults($q, $page)
|
||||||
{
|
{
|
||||||
$notice = new Notice();
|
if (Event::handle('StartNoticeSearchShowResults', array($this, $q, $this->notice))) {
|
||||||
|
if ($this->notice->N === 0) {
|
||||||
$search_engine = $notice->getSearchEngine('notice');
|
$this->showEmptyResults($q, $page);
|
||||||
$search_engine->set_sort_mode('chron');
|
} else {
|
||||||
// Ask for an extra to see if there's more.
|
$terms = preg_split('/[\s,]+/', $q);
|
||||||
$search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
|
$nl = new SearchNoticeList($this->notice, $this, $terms);
|
||||||
if (false === $search_engine->query($q)) {
|
$cnt = $nl->show();
|
||||||
$cnt = 0;
|
$this->pagination($page > 1,
|
||||||
} else {
|
$cnt > NOTICES_PER_PAGE,
|
||||||
$cnt = $notice->find();
|
$page,
|
||||||
|
'noticesearch',
|
||||||
|
array('q' => $q));
|
||||||
|
}
|
||||||
|
Event::handle('EndNoticeSearchShowResults', array($this, $q, $this->notice));
|
||||||
}
|
}
|
||||||
if ($cnt === 0) {
|
}
|
||||||
|
|
||||||
|
function showEmptyResults($q, $page)
|
||||||
|
{
|
||||||
// TRANS: Text for notice search results is the query had no results.
|
// TRANS: Text for notice search results is the query had no results.
|
||||||
$this->element('p', 'error', _('No results.'));
|
$this->element('p', 'error', _('No results.'));
|
||||||
|
|
||||||
@ -137,15 +170,6 @@ class NoticesearchAction extends SearchAction
|
|||||||
$this->raw(common_markup_to_html($message));
|
$this->raw(common_markup_to_html($message));
|
||||||
$this->elementEnd('div');
|
$this->elementEnd('div');
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
if (Event::handle('StartNoticeSearchShowResults', array($this, $q, $notice))) {
|
|
||||||
$terms = preg_split('/[\s,]+/', $q);
|
|
||||||
$nl = new SearchNoticeList($notice, $this, $terms);
|
|
||||||
$cnt = $nl->show();
|
|
||||||
$this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
|
|
||||||
$page, 'noticesearch', array('q' => $q));
|
|
||||||
Event::handle('EndNoticeSearchShowResults', array($this, $q, $notice));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function showScripts()
|
function showScripts()
|
||||||
|
@ -60,7 +60,7 @@ class NudgeAction extends Action
|
|||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
|
||||||
if (!common_logged_in()) {
|
if (!common_logged_in()) {
|
||||||
// TRANS: Client error displayed trying to nudge a user without being logged in.
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
$this->clientError(_('Not logged in.'));
|
$this->clientError(_('Not logged in.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -78,6 +78,7 @@ class NudgeAction extends Action
|
|||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
|
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
$this->clientError(_('There was a problem with your session token. Try again, please.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -132,6 +132,7 @@ class OauthconnectionssettingsAction extends SettingsAction
|
|||||||
|
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->showForm(_('There was a problem with your session token. '.
|
$this->showForm(_('There was a problem with your session token. '.
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
return;
|
return;
|
||||||
|
@ -143,6 +143,7 @@ class PasswordsettingsAction extends SettingsAction
|
|||||||
|
|
||||||
$token = $this->trimmed('token');
|
$token = $this->trimmed('token');
|
||||||
if (!$token || $token != common_session_token()) {
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
$this->showForm(_('There was a problem with your session token. '.
|
$this->showForm(_('There was a problem with your session token. '.
|
||||||
'Try again, please.'));
|
'Try again, please.'));
|
||||||
return;
|
return;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/**
|
/**
|
||||||
* StatusNet, the distributed open-source microblogging tool
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
*
|
*
|
||||||
* Action for showing profiles self-tagged with a given tag
|
* Lists by a user
|
||||||
*
|
*
|
||||||
* PHP version 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
@ -16,13 +16,16 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU Affero General Public License for more details.
|
* GNU Affero General Public License for more details.
|
||||||
*
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* @category Action
|
* @category Personal
|
||||||
* @package StatusNet
|
* @package StatusNet
|
||||||
* @author Evan Prodromou <evan@status.net>
|
* @author Evan Prodromou <evan@status.net>
|
||||||
* @author Zach Copley <zach@status.net>
|
* @author Zach Copley <zach@status.net>
|
||||||
|
* @author Shashi Gowda <connect2shashi@gmail.com>
|
||||||
* @copyright 2009 StatusNet, Inc.
|
* @copyright 2009 StatusNet, Inc.
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||||
* @link http://status.net/
|
* @link http://status.net/
|
||||||
@ -32,150 +35,131 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
require_once INSTALLDIR.'/lib/peopletaglist.php';
|
||||||
* This class outputs a paginated list of profiles self-tagged with a given tag
|
// cache 3 pages
|
||||||
*
|
define('PEOPLETAG_CACHE_WINDOW', PEOPLETAGS_PER_PAGE*3 + 1);
|
||||||
* @category Output
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @author Zach Copley <zach@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* @see Action
|
|
||||||
*/
|
|
||||||
class PeopletagAction extends Action
|
class PeopletagAction extends Action
|
||||||
{
|
{
|
||||||
|
|
||||||
var $tag = null;
|
|
||||||
var $page = null;
|
var $page = null;
|
||||||
|
var $tag = null;
|
||||||
|
|
||||||
/**
|
function isReadOnly($args)
|
||||||
* For initializing members of the class.
|
|
||||||
*
|
|
||||||
* @param array $argarray misc. arguments
|
|
||||||
*
|
|
||||||
* @return boolean true
|
|
||||||
*/
|
|
||||||
function prepare($argarray)
|
|
||||||
{
|
{
|
||||||
parent::prepare($argarray);
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
$this->tag = $this->trimmed('tag');
|
function title()
|
||||||
|
{
|
||||||
if (!common_valid_profile_tag($this->tag)) {
|
if ($this->page == 1) {
|
||||||
// TRANS: Client error displayed when trying to tag a profile with an invalid tag.
|
// TRANS: Title for list page.
|
||||||
// TRANS: %s is the invalid tag.
|
// TRANS: %s is a list.
|
||||||
$this->clientError(sprintf(_('Not a valid people tag: %s.'),
|
return sprintf(_('Public list %s'), $this->tag);
|
||||||
$this->tag));
|
} else {
|
||||||
return;
|
// TRANS: Title for list page.
|
||||||
|
// TRANS: %1$s is a list, %2$d is a page number.
|
||||||
|
return sprintf(_('Public list %1$s, page %2$d'), $this->tag, $this->page);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$this->page = ($this->arg('page')) ? $this->arg('page') : 1;
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
|
||||||
|
|
||||||
common_set_returnto($this->selfUrl());
|
$tag_arg = $this->arg('tag');
|
||||||
|
$tag = common_canonical_tag($tag_arg);
|
||||||
|
|
||||||
|
// Permanent redirect on non-canonical nickname
|
||||||
|
|
||||||
|
if ($tag_arg != $tag) {
|
||||||
|
$args = array('tag' => $nickname);
|
||||||
|
if ($this->page && $this->page != 1) {
|
||||||
|
$args['page'] = $this->page;
|
||||||
|
}
|
||||||
|
common_redirect(common_local_url('peopletag', $args), 301);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->tag = $tag;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
function handle($args)
|
||||||
* Handler method
|
|
||||||
*
|
|
||||||
* @param array $argarray is ignored since it's now passed in in prepare()
|
|
||||||
*
|
|
||||||
* @return boolean is read only action?
|
|
||||||
*/
|
|
||||||
function handle($argarray)
|
|
||||||
{
|
{
|
||||||
parent::handle($argarray);
|
parent::handle($args);
|
||||||
$this->showPage();
|
$this->showPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
function showLocalNav()
|
||||||
* Whips up a query to get a list of profiles based on the provided
|
{
|
||||||
* people tag and page, initalizes a ProfileList widget, and displays
|
$nav = new PublicGroupNav($this);
|
||||||
* it to the user.
|
$nav->show();
|
||||||
*
|
}
|
||||||
* @return nothing
|
|
||||||
*/
|
function showAnonymousMessage()
|
||||||
|
{
|
||||||
|
$notice =
|
||||||
|
// TRANS: Message for anonymous users on list page.
|
||||||
|
// TRANS: This message contains Markdown links in the form [description](link).
|
||||||
|
_('Lists are how you sort similar ' .
|
||||||
|
'people on %%site.name%%, a [micro-blogging]' .
|
||||||
|
'(http://en.wikipedia.org/wiki/Micro-blogging) service ' .
|
||||||
|
'based on the Free Software [StatusNet](http://status.net/) tool. ' .
|
||||||
|
'You can then easily keep track of what they ' .
|
||||||
|
'are doing by subscribing to the list\'s timeline.' );
|
||||||
|
$this->elementStart('div', array('id' => 'anon_notice'));
|
||||||
|
$this->raw(common_markup_to_html($notice));
|
||||||
|
$this->elementEnd('div');
|
||||||
|
}
|
||||||
|
|
||||||
function showContent()
|
function showContent()
|
||||||
{
|
{
|
||||||
|
$offset = ($this->page-1) * PEOPLETAGS_PER_PAGE;
|
||||||
|
$limit = PEOPLETAGS_PER_PAGE + 1;
|
||||||
|
|
||||||
$profile = new Profile();
|
$ptags = new Profile_list();
|
||||||
|
$ptags->tag = $this->tag;
|
||||||
|
|
||||||
$offset = ($this->page - 1) * PROFILES_PER_PAGE;
|
$user = common_current_user();
|
||||||
$limit = PROFILES_PER_PAGE + 1;
|
|
||||||
|
|
||||||
if (common_config('db', 'type') == 'pgsql') {
|
if (empty($user)) {
|
||||||
$lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
|
$ckey = sprintf('profile_list:tag:%s', $this->tag);
|
||||||
|
$ptags->private = false;
|
||||||
|
$ptags->orderBy('profile_list.modified DESC');
|
||||||
|
|
||||||
|
$c = Cache::instance();
|
||||||
|
if ($offset+$limit <= PEOPLETAG_CACHE_WINDOW && !empty($c)) {
|
||||||
|
$cached_ptags = Profile_list::getCached($ckey, $offset, $limit);
|
||||||
|
if ($cached_ptags === false) {
|
||||||
|
$ptags->limit(0, PEOPLETAG_CACHE_WINDOW);
|
||||||
|
$ptags->find();
|
||||||
|
|
||||||
|
Profile_list::setCache($ckey, $ptags, $offset, $limit);
|
||||||
|
} else {
|
||||||
|
$ptags = clone($cached_ptags);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ptags->limit($offset, $limit);
|
||||||
|
$ptags->find();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$lim = ' LIMIT ' . $offset . ', ' . $limit;
|
$ptags->whereAdd('(profile_list.private = false OR (' .
|
||||||
|
' profile_list.tagger =' . $user->id .
|
||||||
|
' AND profile_list.private = true) )');
|
||||||
|
|
||||||
|
$ptags->orderBy('profile_list.modified DESC');
|
||||||
|
$ptags->find();
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: memcached this
|
$pl = new PeopletagList($ptags, $this);
|
||||||
|
$cnt = $pl->show();
|
||||||
|
|
||||||
$qry = 'SELECT profile.* ' .
|
$this->pagination($this->page > 1, $cnt > PEOPLETAGS_PER_PAGE,
|
||||||
'FROM profile JOIN profile_tag ' .
|
$this->page, 'peopletag', array('tag' => $this->tag));
|
||||||
'ON profile.id = profile_tag.tagger ' .
|
|
||||||
'WHERE profile_tag.tagger = profile_tag.tagged ' .
|
|
||||||
"AND tag = '%s' " .
|
|
||||||
'ORDER BY profile_tag.modified DESC%s';
|
|
||||||
|
|
||||||
$profile->query(sprintf($qry, $this->tag, $lim));
|
|
||||||
|
|
||||||
$ptl = new PeopleTagList($profile, $this); // pass the ammunition
|
|
||||||
$cnt = $ptl->show();
|
|
||||||
|
|
||||||
$this->pagination($this->page > 1,
|
|
||||||
$cnt > PROFILES_PER_PAGE,
|
|
||||||
$this->page,
|
|
||||||
'peopletag',
|
|
||||||
array('tag' => $this->tag));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
function showSections()
|
||||||
* Returns the page title
|
|
||||||
*
|
|
||||||
* @return string page title
|
|
||||||
*/
|
|
||||||
function title()
|
|
||||||
{
|
{
|
||||||
// TRANS: Page title for users with a certain self-tag.
|
|
||||||
// TRANS: %1$s is the tag, %2$s is the page number.
|
|
||||||
return sprintf(_('Users self-tagged with %1$s - page %2$d'),
|
|
||||||
$this->tag, $this->page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PeopleTagList extends ProfileList
|
|
||||||
{
|
|
||||||
function newListItem($profile)
|
|
||||||
{
|
|
||||||
return new PeopleTagListItem($profile, $this->action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PeopleTagListItem extends ProfileListItem
|
|
||||||
{
|
|
||||||
function linkAttributes()
|
|
||||||
{
|
|
||||||
$aAttrs = parent::linkAttributes();
|
|
||||||
|
|
||||||
if (common_config('nofollow', 'peopletag')) {
|
|
||||||
$aAttrs['rel'] .= ' nofollow';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $aAttrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
function homepageAttributes()
|
|
||||||
{
|
|
||||||
$aAttrs = parent::linkAttributes();
|
|
||||||
|
|
||||||
if (common_config('nofollow', 'peopletag')) {
|
|
||||||
$aAttrs['rel'] = 'nofollow';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $aAttrs;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
126
actions/peopletagautocomplete.php
Normal file
126
actions/peopletagautocomplete.php
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet - the distributed open-source microblogging tool
|
||||||
|
* Copyright (C) 2008-2010, StatusNet, Inc.
|
||||||
|
*
|
||||||
|
* Peopletag autocomple action.
|
||||||
|
*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
class PeopletagautocompleteAction extends Action
|
||||||
|
{
|
||||||
|
var $user;
|
||||||
|
var $tags;
|
||||||
|
var $last_mod;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
// Only for logged-in users
|
||||||
|
|
||||||
|
$this->user = common_current_user();
|
||||||
|
|
||||||
|
if (empty($this->user)) {
|
||||||
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
|
$this->clientError(_('Not logged in.'));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSRF protection
|
||||||
|
|
||||||
|
$token = $this->trimmed('token');
|
||||||
|
|
||||||
|
if (!$token || $token != common_session_token()) {
|
||||||
|
// TRANS: Client error displayed when the session token does not match or is not given.
|
||||||
|
$this->clientError(_('There was a problem with your session token.'.
|
||||||
|
' Try again, please.'));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$profile = $this->user->getProfile();
|
||||||
|
$tags = $profile->getLists(common_current_user());
|
||||||
|
|
||||||
|
$this->tags = array();
|
||||||
|
while ($tags->fetch()) {
|
||||||
|
|
||||||
|
if (empty($this->last_mod)) {
|
||||||
|
$this->last_mod = $tags->modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
$arr = array();
|
||||||
|
$arr['tag'] = $tags->tag;
|
||||||
|
$arr['mode'] = $tags->private ? 'private' : 'public';
|
||||||
|
// $arr['url'] = $tags->homeUrl();
|
||||||
|
$arr['freq'] = $tags->taggedCount();
|
||||||
|
|
||||||
|
$this->tags[] = $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tags = NULL;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last modified time
|
||||||
|
*
|
||||||
|
* Helps in browser-caching
|
||||||
|
*
|
||||||
|
* @return String time
|
||||||
|
*/
|
||||||
|
function lastModified()
|
||||||
|
{
|
||||||
|
return strtotime($this->last_mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle request
|
||||||
|
*
|
||||||
|
* Print the JSON autocomplete data
|
||||||
|
*
|
||||||
|
* @param Array $args unused.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
//common_log(LOG_DEBUG, 'Autocomplete data: ' . json_encode($this->tags));
|
||||||
|
if ($this->tags) {
|
||||||
|
print(json_encode($this->tags));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
230
actions/peopletagged.php
Normal file
230
actions/peopletagged.php
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* List of people tagged by the user with a tag
|
||||||
|
*
|
||||||
|
* 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 Group
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Shashi Gowda <connect2shashi@gmail.com>
|
||||||
|
* @copyright 2008-2009 StatusNet, Inc.
|
||||||
|
* @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') && !defined('LACONICA')) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once(INSTALLDIR.'/lib/profilelist.php');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of people tagged by the user with a tag
|
||||||
|
*
|
||||||
|
* @category Peopletag
|
||||||
|
* @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/
|
||||||
|
*/
|
||||||
|
class PeopletaggedAction extends OwnerDesignAction
|
||||||
|
{
|
||||||
|
var $page = null;
|
||||||
|
var $peopletag = null;
|
||||||
|
var $tagger = null;
|
||||||
|
|
||||||
|
function isReadOnly($args)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
|
||||||
|
|
||||||
|
$tagger_arg = $this->arg('tagger');
|
||||||
|
$tag_arg = $this->arg('tag');
|
||||||
|
$tagger = common_canonical_nickname($tagger_arg);
|
||||||
|
$tag = common_canonical_tag($tag_arg);
|
||||||
|
|
||||||
|
// Permanent redirect on non-canonical nickname
|
||||||
|
|
||||||
|
if ($tagger_arg != $tagger || $tag_arg != $tag) {
|
||||||
|
$args = array('tagger' => $nickname, 'tag' => $tag);
|
||||||
|
if ($this->page != 1) {
|
||||||
|
$args['page'] = $this->page;
|
||||||
|
}
|
||||||
|
common_redirect(common_local_url('peopletagged', $args), 301);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$tagger) {
|
||||||
|
// TRANS: Client error displayed when a tagger is expected but not provided.
|
||||||
|
$this->clientError(_('No tagger.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = User::staticGet('nickname', $tagger);
|
||||||
|
|
||||||
|
if (!$user) {
|
||||||
|
// TRANS: Client error displayed when referring to non-existing user.
|
||||||
|
$this->clientError(_('No such user.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tagger = $user->getProfile();
|
||||||
|
$this->peopletag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag));
|
||||||
|
|
||||||
|
if (!$this->peopletag) {
|
||||||
|
// TRANS: Client error displayed when referring to a non-existing list.
|
||||||
|
$this->clientError(_('No such list.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function title()
|
||||||
|
{
|
||||||
|
if ($this->page == 1) {
|
||||||
|
// TRANS: Title for list of people listed by the user.
|
||||||
|
// TRANS: %1$s is a list, %2$s is a username.
|
||||||
|
return sprintf(_('People listed in %1$s by %2$s'),
|
||||||
|
$this->peopletag->tag, $this->tagger->nickname);
|
||||||
|
} else {
|
||||||
|
// TRANS: Title for list of people listed by the user.
|
||||||
|
// TRANS: %1$s is a list, %2$s is a username, %2$s is a page number.
|
||||||
|
return sprintf(_('People listed in %1$s by %2$s, page %3$d'),
|
||||||
|
$this->peopletag->tag, $this->user->nickname,
|
||||||
|
$this->page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
$this->showPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPageNotice()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function showLocalNav()
|
||||||
|
{
|
||||||
|
$nav = new PeopletagGroupNav($this, $this->peopletag);
|
||||||
|
$nav->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showContent()
|
||||||
|
{
|
||||||
|
$offset = ($this->page-1) * PROFILES_PER_PAGE;
|
||||||
|
$limit = PROFILES_PER_PAGE + 1;
|
||||||
|
|
||||||
|
$cnt = 0;
|
||||||
|
|
||||||
|
$subs = $this->peopletag->getTagged($offset, $limit);
|
||||||
|
|
||||||
|
if ($subs) {
|
||||||
|
$subscriber_list = new PeopletagMemberList($subs, $this->peopletag, $this);
|
||||||
|
$cnt = $subscriber_list->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
$subs->free();
|
||||||
|
|
||||||
|
$this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
|
||||||
|
$this->page, 'peopletagged',
|
||||||
|
array('tagger' => $this->tagger->nickname,
|
||||||
|
'tag' => $this->peopletag->tag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PeopletagMemberList extends ProfileList
|
||||||
|
{
|
||||||
|
var $peopletag = null;
|
||||||
|
|
||||||
|
function __construct($profile, $peopletag, $action)
|
||||||
|
{
|
||||||
|
parent::__construct($profile, $action);
|
||||||
|
|
||||||
|
$this->peopletag = $peopletag;
|
||||||
|
}
|
||||||
|
|
||||||
|
function newListItem($profile)
|
||||||
|
{
|
||||||
|
return new PeopletagMemberListItem($profile, $this->peopletag, $this->action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PeopletagMemberListItem extends ProfileListItem
|
||||||
|
{
|
||||||
|
var $peopletag = null;
|
||||||
|
|
||||||
|
function __construct($profile, $peopletag, $action)
|
||||||
|
{
|
||||||
|
parent::__construct($profile, $action);
|
||||||
|
|
||||||
|
$this->peopletag = $peopletag;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showFullName()
|
||||||
|
{
|
||||||
|
parent::showFullName();
|
||||||
|
if ($this->profile->id == $this->peopletag->tagger) {
|
||||||
|
$this->out->text(' ');
|
||||||
|
// TRANS: Addition in tag membership list for creator of a tag.
|
||||||
|
$this->out->element('span', 'role', _('Creator'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showActions()
|
||||||
|
{
|
||||||
|
$this->startActions();
|
||||||
|
if (Event::handle('StartProfileListItemActionElements', array($this))) {
|
||||||
|
$this->showSubscribeButton();
|
||||||
|
// TODO: Untag button
|
||||||
|
Event::handle('EndProfileListItemActionElements', array($this));
|
||||||
|
}
|
||||||
|
$this->endActions();
|
||||||
|
}
|
||||||
|
|
||||||
|
function linkAttributes()
|
||||||
|
{
|
||||||
|
// tagging people is healthy page-rank flow.
|
||||||
|
return parent::linkAttributes();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch necessary return-to arguments for the profile forms
|
||||||
|
* to return to this list when they're done.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function returnToArgs()
|
||||||
|
{
|
||||||
|
$args = array('action' => 'peopletagged',
|
||||||
|
'tag' => $this->peopletag->tag,
|
||||||
|
'tagger' => $this->profile->nickname);
|
||||||
|
$page = $this->out->arg('page');
|
||||||
|
if ($page) {
|
||||||
|
$args['param-page'] = $page;
|
||||||
|
}
|
||||||
|
return $args;
|
||||||
|
}
|
||||||
|
}
|
290
actions/peopletagsbyuser.php
Normal file
290
actions/peopletagsbyuser.php
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet, the distributed open-source microblogging tool
|
||||||
|
*
|
||||||
|
* Lists by a user
|
||||||
|
*
|
||||||
|
* 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 Personal
|
||||||
|
* @package StatusNet
|
||||||
|
* @author Shashi Gowda <connect2shashi@gmail.com>
|
||||||
|
* @copyright 2008-2009 StatusNet, Inc.
|
||||||
|
* @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') && !defined('LACONICA')) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once INSTALLDIR.'/lib/peopletaglist.php';
|
||||||
|
|
||||||
|
class PeopletagsbyuserAction extends OwnerDesignAction
|
||||||
|
{
|
||||||
|
var $page = null;
|
||||||
|
var $tagger = null;
|
||||||
|
var $tags = null;
|
||||||
|
|
||||||
|
function isReadOnly($args)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function title()
|
||||||
|
{
|
||||||
|
if ($this->page == 1) {
|
||||||
|
if ($this->isOwner()) {
|
||||||
|
if ($this->arg('private')) {
|
||||||
|
// TRANS: Title for lists by a user page for a private tag.
|
||||||
|
return _('Private lists by you');
|
||||||
|
} else if ($this->arg('public')) {
|
||||||
|
// TRANS: Title for lists by a user page for a public tag.
|
||||||
|
return _('Public lists by you');
|
||||||
|
}
|
||||||
|
// TRANS: Title for lists by a user page.
|
||||||
|
return _('Lists by you');
|
||||||
|
}
|
||||||
|
// TRANS: Title for lists by a user page.
|
||||||
|
// TRANS: %s is a user nickname.
|
||||||
|
return sprintf(_('Lists by %s'), $this->tagger->nickname);
|
||||||
|
} else {
|
||||||
|
// TRANS: Title for lists by a user page.
|
||||||
|
// TRANS: %1$s is a user nickname, %2$d is a page number.
|
||||||
|
return sprintf(_('Lists by %1$s, page %2$d'), $this->tagger->nickname, $this->page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function prepare($args)
|
||||||
|
{
|
||||||
|
parent::prepare($args);
|
||||||
|
|
||||||
|
if ($this->arg('public') && $this->arg('private')) {
|
||||||
|
$this->args['public'] = $this->args['private'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$nickname_arg = $this->arg('nickname');
|
||||||
|
$nickname = common_canonical_nickname($nickname_arg);
|
||||||
|
|
||||||
|
// Permanent redirect on non-canonical nickname
|
||||||
|
|
||||||
|
if ($nickname_arg != $nickname) {
|
||||||
|
$args = $this->getSelfUrlArgs();
|
||||||
|
if ($this->arg('page') && $this->arg('page') != 1) {
|
||||||
|
$args['page'] = $this->arg['page'];
|
||||||
|
}
|
||||||
|
common_redirect(common_local_url('peopletagsbyuser', $args), 301);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->user = User::staticGet('nickname', $nickname);
|
||||||
|
|
||||||
|
if (!$this->user) {
|
||||||
|
// TRANS: Client error displayed trying to perform an action related to a non-existing user.
|
||||||
|
$this->clientError(_('No such user.'), 404);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tagger = $this->user->getProfile();
|
||||||
|
|
||||||
|
if (!$this->tagger) {
|
||||||
|
// TRANS: Error message displayed when referring to a user without a profile.
|
||||||
|
$this->serverError(_('User has no profile.'));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
|
||||||
|
|
||||||
|
|
||||||
|
$offset = ($this->page-1) * PEOPLETAGS_PER_PAGE;
|
||||||
|
$limit = PEOPLETAGS_PER_PAGE + 1;
|
||||||
|
|
||||||
|
$user = common_current_user();
|
||||||
|
if ($this->arg('public')) {
|
||||||
|
$this->tags = $this->tagger->getLists(false, $offset, $limit);
|
||||||
|
} else if ($this->arg('private')) {
|
||||||
|
if (empty($user)) {
|
||||||
|
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
|
||||||
|
$this->clientError(_('Not logged in.'), 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->isOwner()) {
|
||||||
|
$this->tags = $this->tagger->getPrivateTags($offset, $limit);
|
||||||
|
} else {
|
||||||
|
// TRANS: Client error displayed when trying view another user's private lists.
|
||||||
|
$this->clientError(_('You cannot view others\' private lists'), 403);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->tags = $this->tagger->getLists(common_current_user(), $offset, $limit);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle($args)
|
||||||
|
{
|
||||||
|
parent::handle($args);
|
||||||
|
|
||||||
|
# Post from the tag dropdown; redirect to a GET
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
common_redirect(common_local_url('peopletagsbyuser', $this->getSelfUrlArgs()), 303);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->showPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showModeSelector()
|
||||||
|
{
|
||||||
|
$this->elementStart('dl', array('id'=>'filter_tags'));
|
||||||
|
// TRANS: Mode selector label.
|
||||||
|
$this->element('dt', null, _('Mode'));
|
||||||
|
$this->elementStart('dd');
|
||||||
|
$this->elementStart('ul');
|
||||||
|
$this->elementStart('li', array('id' => 'filter_tags_for',
|
||||||
|
'class' => 'child_1'));
|
||||||
|
$this->element('a',
|
||||||
|
array('href' =>
|
||||||
|
common_local_url('peopletagsforuser',
|
||||||
|
array('nickname' => $this->user->nickname))),
|
||||||
|
// TRANS: Link text to show lists for user %s.
|
||||||
|
sprintf(_('Lists for %s'), $this->tagger->nickname));
|
||||||
|
$this->elementEnd('li');
|
||||||
|
|
||||||
|
if ($this->isOwner()) {
|
||||||
|
$this->elementStart('li', array('id'=>'filter_tags_item'));
|
||||||
|
$this->elementStart('form', array('name' => 'modeselector',
|
||||||
|
'id' => 'form_filter_bymode',
|
||||||
|
'action' => common_local_url('peopletagsbyuser',
|
||||||
|
array('nickname' => $this->tagger->nickname)),
|
||||||
|
'method' => 'post'));
|
||||||
|
$this->elementStart('fieldset');
|
||||||
|
// TRANS: Fieldset legend.
|
||||||
|
$this->element('legend', null, _('Select tag to filter'));
|
||||||
|
|
||||||
|
$priv = $this->arg('private');
|
||||||
|
$pub = $this->arg('public');
|
||||||
|
|
||||||
|
if (!$priv && !$pub) {
|
||||||
|
$priv = $pub = true;
|
||||||
|
}
|
||||||
|
// TRANS: Checkbox label to show private tags.
|
||||||
|
$this->checkbox('private', _m('LABEL','Private'), $priv,
|
||||||
|
// TRANS: Checkbox title.
|
||||||
|
_('Show private tags.'));
|
||||||
|
// TRANS: Checkbox label to show public tags.
|
||||||
|
$this->checkbox('public', _m('LABEL','Public'), $pub,
|
||||||
|
// TRANS: Checkbox title.
|
||||||
|
_('Show public tags.'));
|
||||||
|
$this->hidden('nickname', $this->user->nickname);
|
||||||
|
// TRANS: Submit button text for tag filter form.
|
||||||
|
$this->submit('submit', _m('BUTTON','Go'));
|
||||||
|
$this->elementEnd('fieldset');
|
||||||
|
$this->elementEnd('form');
|
||||||
|
$this->elementEnd('li');
|
||||||
|
}
|
||||||
|
$this->elementEnd('ul');
|
||||||
|
$this->elementEnd('dd');
|
||||||
|
$this->elementEnd('dl');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showAnonymousMessage()
|
||||||
|
{
|
||||||
|
$notice =
|
||||||
|
// TRANS: Message displayed for anonymous users on page that displays lists by a user.
|
||||||
|
// TRANS: This message contains Markdown links in the form [description](links).
|
||||||
|
// TRANS: %s is a tagger nickname.
|
||||||
|
sprintf(_('These are lists created by **%s**. ' .
|
||||||
|
'Lists are how you sort similar ' .
|
||||||
|
'people on %%%%site.name%%%%, a [micro-blogging]' .
|
||||||
|
'(http://en.wikipedia.org/wiki/Micro-blogging) service ' .
|
||||||
|
'based on the Free Software [StatusNet](http://status.net/) tool. ' .
|
||||||
|
'You can easily keep track of what they ' .
|
||||||
|
'are doing by subscribing to the tag\'s timeline.' ), $this->tagger->nickname);
|
||||||
|
$this->elementStart('div', array('id' => 'anon_notice'));
|
||||||
|
$this->raw(common_markup_to_html($notice));
|
||||||
|
$this->elementEnd('div');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPageNotice()
|
||||||
|
{
|
||||||
|
$this->elementStart('div', 'instructions');
|
||||||
|
$this->showModeSelector();
|
||||||
|
$this->elementEnd('div');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showContent()
|
||||||
|
{
|
||||||
|
#TODO: controls here.
|
||||||
|
|
||||||
|
$pl = new PeopletagList($this->tags, $this);
|
||||||
|
$cnt = $pl->show();
|
||||||
|
|
||||||
|
if ($cnt == 0) {
|
||||||
|
$this->showEmptyListMessage();
|
||||||
|
}
|
||||||
|
$this->pagination($this->page > 1, $cnt > PEOPLETAGS_PER_PAGE,
|
||||||
|
$this->page, 'peopletagsbyuser', $this->getSelfUrlArgs());
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSelfUrlArgs()
|
||||||
|
{
|
||||||
|
$args = array();
|
||||||
|
if ($this->arg('private')) {
|
||||||
|
$args['private'] = 1;
|
||||||
|
} else if ($this->arg('public')) {
|
||||||
|
$args['public'] = 1;
|
||||||
|
}
|
||||||
|
$args['nickname'] = $this->trimmed('nickname');
|
||||||
|
|
||||||
|
return $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isOwner()
|
||||||
|
{
|
||||||
|
$user = common_current_user();
|
||||||
|
return !empty($user) && $user->id == $this->tagger->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showObjectNav()
|
||||||
|
{
|
||||||
|
$nav = new PeopletagNav($this, $this->tagger);
|
||||||
|
$nav->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showEmptyListMessage()
|
||||||
|
{
|
||||||
|
// TRANS: Message displayed on page that displays lists by a user when there are none.
|
||||||
|
// TRANS: This message contains Markdown links in the form [description](links).
|
||||||
|
// TRANS: %s is a tagger nickname.
|
||||||
|
$message = sprintf(_('%s has not created any [lists](%%%%doc.lists%%%%) yet.'), $this->tagger->nickname);
|
||||||
|
$this->elementStart('div', 'guide');
|
||||||
|
$this->raw(common_markup_to_html($message));
|
||||||
|
$this->elementEnd('div');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showProfileBlock()
|
||||||
|
{
|
||||||
|
$block = new AccountProfileBlock($this, $this->tagger);
|
||||||
|
$block->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSections()
|
||||||
|
{
|
||||||
|
#TODO: tags with most subscribers
|
||||||
|
#TODO: tags with most "members"
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user