+++ /dev/null
-<?php
-/**
- * StatusNet, the distributed open-source microblogging tool
- *
- * Show the user's hcard
- *
- * 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 Evan Prodromou <evan@status.net>
- * @copyright 2010 StatusNet, Inc.
- * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
- * @link http://status.net/
- */
-
-if (!defined('STATUSNET')) {
- exit(1);
-}
-
-/**
- * User profile page
- *
- * @category Personal
- * @package StatusNet
- * @author Evan Prodromou <evan@status.net>
- * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
- * @link http://status.net/
- */
-class HcardAction extends Action
-{
- var $user;
- var $profile;
-
- function prepare($args)
- {
- parent::prepare($args);
-
- $nickname_arg = $this->arg('nickname');
- $nickname = common_canonical_nickname($nickname_arg);
-
- // Permanent redirect on non-canonical nickname
-
- if ($nickname_arg != $nickname) {
- $args = array('nickname' => $nickname);
- common_redirect(common_local_url('hcard', $args), 301);
- return false;
- }
-
- $this->user = User::staticGet('nickname', $nickname);
-
- if (!$this->user) {
- // TRANS: Client error displayed when trying to get a user hCard for a non-existing user.
- $this->clientError(_('No such user.'), 404);
- return false;
- }
-
- $this->profile = $this->user->getProfile();
-
- if (!$this->profile) {
- // TRANS: Error message displayed when referring to a user without a profile.
- $this->serverError(_('User has no profile.'));
- return false;
- }
-
- return true;
- }
-
- function handle($args)
- {
- parent::handle($args);
- $this->showPage();
- }
-
- function title()
- {
- return $this->profile->getBestName();
- }
-
- function showContent()
- {
- $up = new ShortUserProfile($this, $this->user, $this->profile);
- $up->show();
- }
-
- function showHeader()
- {
- return;
- }
-
- function showAside()
- {
- return;
- }
-
- function showSecondaryNav()
- {
- return;
- }
-}
-
-class ShortUserProfile extends UserProfile
-{
- function showEntityActions()
- {
- return;
- }
-}
+++ /dev/null
-<?php
-/**
- * StatusNet, the distributed open-source microblogging tool
- *
- * Public tag cloud for 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 Public
- * @package StatusNet
- * @author Mike Cochrane <mikec@mikenz.geek.nz>
- * @author Evan Prodromou <evan@status.net>
- * @copyright 2008 Mike Cochrane
- * @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); }
-
-define('TAGS_PER_PAGE', 100);
-
-/**
- * Public tag cloud for notices
- *
- * @category Personal
- * @package StatusNet
- * @author Mike Cochrane <mikec@mikenz.geek.nz>
- * @author Evan Prodromou <evan@status.net>
- * @copyright 2008 Mike Cochrane
- * @copyright 2008-2009 StatusNet, Inc.
- * @link http://status.net/
- */
-class PublicpeopletagcloudAction extends Action
-{
- function isReadOnly($args)
- {
- return true;
- }
-
- function title()
- {
- // TRANS: Title for page with public list cloud.
- return _('Public list cloud');
- }
-
- function showPageNotice()
- {
- $this->element('p', 'instructions',
- // TRANS: Page notice for page with public list cloud.
- // TRANS: %s is a StatusNet sitename.
- sprintf(_('These are largest lists on %s'),
- common_config('site', 'name')));
- }
-
- function showEmptyList()
- {
- // TRANS: Empty list message on page with public list cloud.
- // TRANS: This message contains Markdown links in the form [description](link).
- $message = _('No one has [listed](%%doc.tags%%) anyone yet.') . ' ';
-
- if (common_logged_in()) {
- // TRANS: Additional empty list message on page with public list cloud for logged in users.
- $message .= _('Be the first to list someone!');
- }
- else {
- // TRANS: Additional empty list message on page with public list cloud for anonymous users.
- // TRANS: This message contains Markdown links in the form [description](link).
- $message .= _('Why not [register an account](%%action.register%%) and be the first to list someone!');
- }
-
- $this->elementStart('div', 'guide');
- $this->raw(common_markup_to_html($message));
- $this->elementEnd('div');
- }
-
- function showLocalNav()
- {
- $nav = new PublicGroupNav($this);
- $nav->show();
- }
-
- function handle($args)
- {
- parent::handle($args);
- $this->showPage();
- }
-
- function showContent()
- {
- // XXX: cache this
-
- $tags = new Profile_tag();
- $plist = new Profile_list();
- $plist->private = false;
-
- $tags->joinAdd($plist);
- $tags->selectAdd();
- $tags->selectAdd('profile_tag.tag');
- $tags->selectAdd('count(profile_tag.tag) as weight');
- $tags->groupBy('profile_tag.tag');
- $tags->orderBy('weight DESC');
-
- $tags->limit(TAGS_PER_PAGE);
-
- $cnt = $tags->find();
-
- if ($cnt > 0) {
- $this->elementStart('div', array('id' => 'tagcloud',
- 'class' => 'section'));
-
- $tw = array();
- $sum = 0;
- while ($tags->fetch()) {
- $tw[$tags->tag] = $tags->weight;
- $sum += $tags->weight;
- }
-
- ksort($tw);
-
- $this->elementStart('dl');
- // TRANS: DT element on on page with public list cloud.
- $this->element('dt', null, _('List cloud'));
- $this->elementStart('dd');
- $this->elementStart('ul', 'tags xoxo tag-cloud');
- foreach ($tw as $tag => $weight) {
- if ($sum) {
- $weightedSum = $weight/$sum;
- } else {
- $weightedSum = 0.5;
- }
- $this->showTag($tag, $weight, $weightedSum);
- }
- $this->elementEnd('ul');
- $this->elementEnd('dd');
- $this->elementEnd('dl');
- $this->elementEnd('div');
- } else {
- $this->showEmptyList();
- }
- }
-
- function showTag($tag, $weight, $relative)
- {
- if ($relative > 0.1) {
- $rel = 'tag-cloud-7';
- } else if ($relative > 0.05) {
- $rel = 'tag-cloud-6';
- } else if ($relative > 0.02) {
- $rel = 'tag-cloud-5';
- } else if ($relative > 0.01) {
- $rel = 'tag-cloud-4';
- } else if ($relative > 0.005) {
- $rel = 'tag-cloud-3';
- } else if ($relative > 0.002) {
- $rel = 'tag-cloud-2';
- } else {
- $rel = 'tag-cloud-1';
- }
-
- $this->elementStart('li', $rel);
-
- // TRANS: Link title for number of listed people. %d is the number of listed people.
- $title = sprintf(_m('1 person listed','%d people listed',$weight),$weight);
- $this->element('a', array('href' => common_local_url('peopletag', array('tag' => $tag)),
- 'title' => $title), $tag);
- $this->elementEnd('li');
- }
-}
return new ArrayWrapper($lists);
}
+ /**
+ * Get tags that other people put on this profile, in reverse-chron order
+ *
+ * @param (Profile|User) $auth_user Authorized user (used for privacy)
+ * @param int $offset Offset from latest
+ * @param int $limit Max number to get
+ * @param datetime $since_id max date
+ * @param datetime $max_id min date
+ *
+ * @return Profile_list resulting lists
+ */
+
function getOtherTags($auth_user=null, $offset=0, $limit=null, $since_id=0, $max_id=0)
{
- $lists = new Profile_list();
+ $list = new Profile_list();
- $tags = new Profile_tag();
- $tags->tagged = $this->id;
+ $qry = sprintf('select profile_list.*, unix_timestamp(profile_tag.modified) as "cursor" ' .
+ 'from profile_tag join profile_list '.
+ 'on (profile_tag.tagger = profile_list.tagger ' .
+ ' and profile_tag.tag = profile_list.tag) ' .
+ 'where profile_tag.tagged = %d ',
+ $this->id);
- $lists->joinAdd($tags);
-
- #@fixme: postgres (round(date_part('epoch', my_date)))
- $lists->selectAdd('unix_timestamp(profile_tag.modified) as "cursor"');
if ($auth_user instanceof User || $auth_user instanceof Profile) {
- $lists->whereAdd('( ( profile_list.private = false ) ' .
- 'OR ( profile_list.tagger = ' . $auth_user->id . ' AND ' .
- 'profile_list.private = true ) )');
+ $qry .= sprintf('AND ( ( profile_list.private = false ) ' .
+ 'OR ( profile_list.tagger = %d AND ' .
+ 'profile_list.private = true ) )',
+ $auth_user->id);
} else {
- $lists->private = false;
+ $qry .= 'AND profile_list.private = 0 ';
}
- if ($since_id>0) {
- $lists->whereAdd('cursor > '.$since_id);
+ if ($since_id > 0) {
+ $qry .= sprintf('AND (cursor > %d) ', $since_id);
}
- if ($max_id>0) {
- $lists->whereAdd('cursor <= '.$max_id);
+ if ($max_id > 0) {
+ $qry .= sprintf('AND (cursor < %d) ', $max_id);
}
- if($offset>=0 && !is_null($limit)) {
- $lists->limit($offset, $limit);
- }
+ $qry .= 'ORDER BY profile_tag.modified DESC ';
- $lists->orderBy('profile_tag.modified DESC');
- $lists->find();
+ if ($offset >= 0 && !is_null($limit)) {
+ $qry .= sprintf('LIMIT %d OFFSET %d ', $limit, $offset);
+ }
- return $lists;
+ $list->query($qry);
+ return $list;
}
function getPrivateTags($offset=0, $limit=null, $since_id=0, $max_id=0)
{
$subs = new Profile();
- $subs->joinAdd(array('id', 'profile_tag_subscription:profile_tag_id'));
+ $subs->joinAdd(
+ array('id', 'profile_tag_subscription:profile_id')
+ );
+ $subs->whereAdd('profile_tag_subscription.profile_tag_id = ' . $this->id);
$subs->selectAdd('unix_timestamp(profile_tag_subscription.' .
'created) as "cursor"');
return $tags;
}
- $profile_tag = new Profile_tag();
- $profile_list->tagger = $tagger;
- $profile_tag->tagged = $tagged;
-
- $profile_list->selectAdd();
+ $qry = 'select profile_list.* from profile_list left join '.
+ 'profile_tag on (profile_list.tag = profile_tag.tag and '.
+ 'profile_list.tagger = profile_tag.tagger) where '.
+ 'profile_tag.tagger = %d and profile_tag.tagged = %d ';
+ $qry = sprintf($qry, $tagger, $tagged);
+
+ if (!$include_priv) {
+ $qry .= ' and profile_list.private = 0';
+ }
- // only fetch id, tag, mainpage and
- // private hoping this will be faster
- $profile_list->selectAdd('profile_list.id, ' .
- 'profile_list.tag, ' .
- 'profile_list.mainpage, ' .
- 'profile_list.private');
- $profile_list->joinAdd($profile_tag);
- $profile_list->find();
+ $profile_list->query($qry);
Profile_list::setCache($key, $profile_list);
static function getTagsArray($tagger, $tagged, $auth_user_id=null)
{
$ptag = new Profile_tag();
- $ptag->tagger = $tagger;
- $ptag->tagged = $tagged;
-
- if ($tagger != $auth_user_id) {
- $list = new Profile_list();
- $list->private = false;
- $ptag->joinAdd($list);
- $ptag->selectAdd();
- $ptag->selectAdd('profile_tag.tag');
+
+ $qry = sprintf('select profile_tag.tag '.
+ 'from profile_tag join profile_list '.
+ ' on (profile_tag.tagger = profile_list.tagger ' .
+ ' and profile_tag.tag = profile_list.tag) ' .
+ 'where profile_tag.tagger = %d ' .
+ 'and profile_tag.tagged = %d ',
+ $tagger, $tagged);
+
+ if ($auth_user_id != $tagger) {
+ $qry .= 'and profile_list.private = 0';
}
$tags = array();
- $ptag->find();
+
+ $ptag->query($qry);
+
while ($ptag->fetch()) {
$tags[] = $ptag->tag;
}
- $ptag->free();
return $tags;
}
* double-check what we've been doing on postgres?
*/
-$classes = array('Profile',
+$classes = array('Schema_version',
+ 'Profile',
'Avatar',
'Sms_carrier',
'User',
'Conversation',
'Local_group',
'User_urlshortener_prefs',
- 'Schema_version',
'Old_school_prefs',
);
an existing public tag as private or vice-versa, go to the tag's
edit page.
-The most used public tags are displayed in the
-[public people tag cloud](%%action.publicpeopletagcloud%%). Their
-size shows their frequency of use.
-
Remote people tags
------------------
The HTML for the notice will link to a stream of all the other notices
with that tag. This can be a great way to keep track of a conversation.
-The most popular current tags on the site can be found in the [public
-tag cloud](%%action.publictagcloud%%). Their size shows their
-popularity and recency.
-
Tagging yourself
----------------
$notice->selectAdd();
$notice->selectAdd('notice.id');
+ $ptag = new Profile_tag();
+ $ptag->tag = $this->profile_list->tag;
+ $ptag->tagger = $this->profile_list->tagger;
$notice->joinAdd(array('profile_id', 'profile_tag:tagged'));
-
+ $notice->whereAdd('profile_tag.tagger = ' . $this->profile_list->tagger);
$notice->whereAdd(sprintf('profile_tag.tag = "%s"', $this->profile_list->tag));
- $notice->whereAdd(sprintf('profile_tag.tagger = %d', $this->profile_list->tagger));
if ($since_id != 0) {
$notice->whereAdd('notice.id > ' . $since_id);
foreach (array('subscriptions', 'subscribers',
'all', 'foaf', 'replies',
- 'microsummary', 'hcard') as $a) {
+ 'microsummary') as $a) {
$m->connect($a,
array('action' => $a,
'nickname' => $nickname));
foreach (array('subscriptions', 'subscribers',
'nudge', 'all', 'foaf', 'replies',
- 'inbox', 'outbox', 'microsummary', 'hcard') as $a) {
+ 'inbox', 'outbox', 'microsummary') as $a) {
$m->connect(':nickname/'.$a,
array('action' => $a),
array('nickname' => Nickname::DISPLAY_FMT));
// people tags
- if (!common_config('performance', 'high')) {
- $m->connect('peopletags', array('action' => 'publicpeopletagcloud'));
- }
-
$m->connect('peopletag/:tag', array('action' => 'peopletag',
'tag' => self::REGEX_TAG));
// Ruh roh. Fall back to default, then.
- common_log(LOG_WARN, sprintf("Unable to find theme '%s', falling back to default theme '%s'",
- $name,
- Theme::FALLBACK));
+ common_log(LOG_WARNING, sprintf("Unable to find theme '%s', falling back to default theme '%s'",
+ $name,
+ Theme::FALLBACK));
$this->name = Theme::FALLBACK;
$this->dir = $instroot.'/'.Theme::FALLBACK;
} else {
$shortenedUrl = common_local_url('redirecturl',
array('id' => $f->id));
- return $shortenedUrl;
+ if ((mb_strlen($shortenedUrl) < mb_strlen($long_url)) || $force) {
+ return $shortenedUrl;
+ } else {
+ return $long_url;
+ }
}
} else {
return $long_url;
'type' => 'text/html',
'href' => $profile->profileurl);
- // hCard
- $xrd->links[] = array('rel' => self::HCARD,
- 'type' => 'text/html',
- 'href' => common_local_url('hcard', array('nickname' => $nick)));
-
// XFN
$xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11',
'type' => 'text/html',
'format' => 'atom')),
'type' => 'application/atom+xml');
- // hCard
- $xrd->links[] = array('rel' => Discovery::HCARD,
- 'type' => 'text/html',
- 'href' => common_local_url('hcard', array('nickname' => $nick)));
-
// XFN
$xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11',
'type' => 'text/html',
initSubscriptionURI();
initGroupMemberURI();
+ initProfileLists();
+
Event::handle('EndUpgrade');
}
}
printfnq("DONE.\n");
}
+function initProfileLists()
+{
+ printfnq("Ensuring all profile tags have a corresponding list...");
+
+ $ptag = new Profile_tag();
+ $ptag->selectAdd();
+ $ptag->selectAdd('tagger, tag, count(*) as tagged_count');
+ $ptag->whereAdd('NOT EXISTS (SELECT tagger, tagged from profile_list '.
+ 'where profile_tag.tagger = profile_list.tagger '.
+ 'and profile_tag.tag = profile_list.tag)');
+ $ptag->groupBy('tagger, tag');
+ $ptag->orderBy('tagger, tag');
+
+ if ($ptag->find()) {
+ while ($ptag->fetch()) {
+ $plist = new Profile_list();
+
+ $plist->tagger = $ptag->tagger;
+ $plist->tag = $ptag->tag;
+ $plist->private = 0;
+ $plist->created = common_sql_now();
+ $plist->modified = $plist->created;
+ $plist->mainpage = common_local_url('showprofiletag',
+ array('tagger' => $plist->getTagger()->nickname,
+ 'tag' => $plist->tag));;
+
+ $plist->tagged_count = $ptag->tagged_count;
+ $plist->subscriber_count = 0;
+
+ $plist->insert();
+
+ $orig = clone($plist);
+ // After insert since it uses auto-generated ID
+ $plist->uri = common_local_url('profiletagbyid',
+ array('id' => $plist->id, 'tagger_id' => $plist->tagger));
+
+ $plist->update($orig);
+ }
+ }
+
+ printfnq("DONE.\n");
+}
+
main();