Merge branch '0.8.x' into groupblock

This commit is contained in:
Evan Prodromou 2009-06-14 14:55:08 -07:00
commit 10b7e8ff69
12 changed files with 351 additions and 162 deletions

View File

@ -127,7 +127,7 @@ class GroupmembersAction extends Action
$members = $this->group->getMembers($offset, $limit); $members = $this->group->getMembers($offset, $limit);
if ($members) { if ($members) {
$member_list = new ProfileList($members, null, $this); $member_list = new GroupMemberList($members, $this->group, $this);
$cnt = $member_list->show(); $cnt = $member_list->show();
} }
@ -138,3 +138,15 @@ class GroupmembersAction extends Action
array('nickname' => $this->group->nickname)); array('nickname' => $this->group->nickname));
} }
} }
class GroupMemberList extends ProfileList {
var $group = null;
function __construct($profile, $group=null, $action=null)
{
parent::__construct($profile, $action);
$this->group = $group;
}
}

View File

@ -344,7 +344,7 @@ class ShowgroupAction extends Action
$this->element('h2', null, _('Members')); $this->element('h2', null, _('Members'));
$pml = new ProfileMiniList($member, null, $this); $pml = new ProfileMiniList($member, $this);
$cnt = $pml->show(); $cnt = $pml->show();
if ($cnt == 0) { if ($cnt == 0) {
$this->element('p', null, _('(None)')); $this->element('p', null, _('(None)'));

View File

@ -130,18 +130,34 @@ class SubscribersAction extends GalleryAction
} }
} }
class SubscribersList extends ProfileList class SubscribersList extends SubscriptionList
{ {
function showBlockForm() function newListItem($profile)
{ {
$bf = new BlockForm($this->out, $this->profile, return new SubscribersListItem($profile, $this->owner, $this->action);
array('action' => 'subscribers', }
'nickname' => $this->owner->nickname)); }
$bf->show();
} class SubscribersListItem extends SubscriptionListItem
{
function isReadOnly($args) function showActions()
{ {
return true; $this->startActions();
$this->showSubscribeButton();
// Relevant code!
$this->showBlockForm();
$this->endActions();
}
function showBlockForm()
{
$user = common_current_user();
if (!empty($user) && $this->owner->id == $user->id) {
$bf = new BlockForm($this->out, $this->profile,
array('action' => 'subscribers',
'nickname' => $this->owner->nickname));
$bf->show();
}
} }
} }

View File

@ -137,22 +137,46 @@ class SubscriptionsAction extends GalleryAction
} }
} }
class SubscriptionsList extends ProfileList // XXX SubscriptionsList and SubscriptionList are dangerously close
class SubscriptionsList extends SubscriptionList
{ {
function showOwnerControls($profile) function newListItem($profile)
{
return new SubscriptionsListItem($profile, $this->owner, $this->action);
}
}
class SubscriptionsListItem extends SubscriptionListItem
{
function showProfile()
{
$this->startProfile();
$this->showAvatar();
$this->showFullName();
$this->showLocation();
$this->showHomepage();
$this->showBio();
$this->showTags();
// Relevant portion!
$this->showOwnerControls();
$this->endProfile();
}
function showOwnerControls()
{ {
$sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id, $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
'subscribed' => $profile->id)); 'subscribed' => $this->profile->id));
if (!$sub) { if (!$sub) {
return; return;
} }
$this->out->elementStart('form', array('id' => 'subedit-' . $profile->id, $this->out->elementStart('form', array('id' => 'subedit-' . $this->profile->id,
'method' => 'post', 'method' => 'post',
'class' => 'form_subscription_edit', 'class' => 'form_subscription_edit',
'action' => common_local_url('subedit'))); 'action' => common_local_url('subedit')));
$this->out->hidden('token', common_session_token()); $this->out->hidden('token', common_session_token());
$this->out->hidden('profile', $profile->id); $this->out->hidden('profile', $this->profile->id);
$this->out->checkbox('jabber', _('Jabber'), $sub->jabber); $this->out->checkbox('jabber', _('Jabber'), $sub->jabber);
$this->out->checkbox('sms', _('SMS'), $sub->sms); $this->out->checkbox('sms', _('SMS'), $sub->sms);
$this->out->submit('save', _('Save')); $this->out->submit('save', _('Save'));

View File

@ -427,49 +427,50 @@ create table group_inbox (
create table file ( create table file (
id integer primary key auto_increment, id integer primary key auto_increment,
url varchar(255), mimetype varchar(50), url varchar(255) comment 'destination URL after following redirections',
size integer, mimetype varchar(50) comment 'mime type of resource',
title varchar(255), size integer comment 'size of resource when available',
date integer(11), title varchar(255) comment 'title of resource when available',
protected integer(1), date integer(11) comment 'date of resource according to http query',
protected integer(1) comment 'true when URL is private (needs login)',
unique(url) unique(url)
) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci; ) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
create table file_oembed ( create table file_oembed (
id integer primary key auto_increment, id integer primary key auto_increment,
file_id integer, file_id integer comment 'oEmbed for that URL/file' references file (id),
version varchar(20), version varchar(20) comment 'oEmbed spec. version',
type varchar(20), type varchar(20) comment 'oEmbed type: photo, video, link, rich',
provider varchar(50), provider varchar(50) comment 'name of this oEmbed provider',
provider_url varchar(255), provider_url varchar(255) comment 'URL of this oEmbed provider',
width integer, width integer comment 'width of oEmbed resource when available',
height integer, height integer comment 'height of oEmbed resource when available',
html text, html text comment 'html representation of this oEmbed resource when applicable',
title varchar(255), title varchar(255) comment 'title of oEmbed resource when available',
author_name varchar(50), author_name varchar(50) comment 'author name for this oEmbed resource',
author_url varchar(255), author_url varchar(255) comment 'author URL for this oEmbed resource',
url varchar(255), url varchar(255) comment 'URL for this oEmbed resource when applicable (photo, link)',
unique(file_id) unique(file_id)
) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci; ) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
create table file_redirection ( create table file_redirection (
id integer primary key auto_increment, id integer primary key auto_increment,
url varchar(255), url varchar(255) comment 'short URL (or any other kind of redirect) for file (id)',
file_id integer, file_id integer comment 'short URL for what URL/file' references file (id),
redirections integer, redirections integer comment 'redirect count',
httpcode integer, httpcode integer comment 'HTTP status code (20x, 30x, etc.)',
unique(url) unique(url)
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
create table file_thumbnail ( create table file_thumbnail (
id integer primary key auto_increment, id integer primary key auto_increment,
file_id integer, file_id integer comment 'thumbnail for what URL/file' references file (id),
url varchar(255), url varchar(255) comment 'URL of thumbnail',
width integer, width integer comment 'width of thumbnail',
height integer, height integer comment 'height of thumbnail',
unique(file_id), unique(file_id),
unique(url) unique(url)
@ -477,8 +478,8 @@ create table file_thumbnail (
create table file_to_post ( create table file_to_post (
id integer primary key auto_increment, id integer primary key auto_increment,
file_id integer, file_id integer comment 'id of URL/file' references file (id),
post_id integer, post_id integer comment 'id of the notice it belongs to' references notice (id),
unique(file_id, post_id) unique(file_id, post_id)
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;

View File

@ -48,13 +48,18 @@ function handleError($error)
$logmsg .= " : ". $error->getDebugInfo(); $logmsg .= " : ". $error->getDebugInfo();
} }
common_log(LOG_ERR, $logmsg); common_log(LOG_ERR, $logmsg);
$msg = sprintf(_('The database for %s isn\'t responding correctly, '. if ($error instanceof DB_DataObject_Error) {
'so the site won\'t work properly. '. $msg = sprintf(_('The database for %s isn\'t responding correctly, '.
'The site admins probably know about the problem, '. 'so the site won\'t work properly. '.
'but you can contact them at %s to make sure. '. 'The site admins probably know about the problem, '.
'Otherwise, wait a few minutes and try again.'), 'but you can contact them at %s to make sure. '.
common_config('site', 'name'), 'Otherwise, wait a few minutes and try again.'),
common_config('site', 'email')); common_config('site', 'name'),
common_config('site', 'email'));
} else {
$msg = _('An important error occured, probably related to email setup. '.
'Check logfiles for more info..');
}
$dac = new DBErrorAction($msg, 500); $dac = new DBErrorAction($msg, 500);
$dac->showPage(); $dac->showPage();
@ -70,7 +75,7 @@ function main()
global $user, $action, $config; global $user, $action, $config;
Snapshot::check(); Snapshot::check();
if (!_have_config()) { if (!_have_config()) {
$msg = sprintf(_("No configuration file found. Try running ". $msg = sprintf(_("No configuration file found. Try running ".
"the installation program first.")); "the installation program first."));

View File

@ -206,24 +206,10 @@ class NoticeListItem extends Widget
return 'shownotice' !== $this->out->args['action']; return 'shownotice' !== $this->out->args['action'];
} }
/*
function attachmentCount($discriminant = true) {
$file_oembed = new File_oembed;
$query = "select count(*) as c from file_oembed join file_to_post on file_oembed.file_id = file_to_post.file_id where post_id=" . $this->notice->id;
$file_oembed->query($query);
$file_oembed->fetch();
return intval($file_oembed->c);
}
*/
function showWithAttachment() {
}
function showNoticeInfo() function showNoticeInfo()
{ {
$this->out->elementStart('div', 'entry-content'); $this->out->elementStart('div', 'entry-content');
$this->showNoticeLink(); $this->showNoticeLink();
// $this->showWithAttachment();
$this->showNoticeSource(); $this->showNoticeSource();
$this->showContext(); $this->showContext();
$this->out->elementEnd('div'); $this->out->elementEnd('div');

View File

@ -56,20 +56,25 @@ class PeopleSearchResults extends ProfileList
function __construct($profile, $terms, $action) function __construct($profile, $terms, $action)
{ {
parent::__construct($profile, $terms, $action); parent::__construct($profile, $action);
$this->terms = array_map('preg_quote', $this->terms = array_map('preg_quote',
array_map('htmlspecialchars', $terms)); array_map('htmlspecialchars', $terms));
$this->pattern = '/('.implode('|',$terms).')/i'; $this->pattern = '/('.implode('|',$terms).')/i';
} }
function newProfileItem($profile)
{
return new PeopleSearchResultItem($profile, $this->action);
}
}
class PeopleSearchResultItem extends ProfileListItem
{
function highlight($text) function highlight($text)
{ {
return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text)); return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
} }
function isReadOnly($args)
{
return true;
}
} }

View File

@ -110,7 +110,7 @@ class ProfileAction extends Action
$this->element('h2', null, _('Subscriptions')); $this->element('h2', null, _('Subscriptions'));
if ($profile) { if ($profile) {
$pml = new ProfileMiniList($profile, $this->user, $this); $pml = new ProfileMiniList($profile, $this);
$cnt = $pml->show(); $cnt = $pml->show();
if ($cnt == 0) { if ($cnt == 0) {
$this->element('p', null, _('(None)')); $this->element('p', null, _('(None)'));
@ -139,7 +139,7 @@ class ProfileAction extends Action
$this->element('h2', null, _('Subscribers')); $this->element('h2', null, _('Subscribers'));
if ($profile) { if ($profile) {
$pml = new ProfileMiniList($profile, $this->user, $this); $pml = new ProfileMiniList($profile, $this);
$cnt = $pml->show(); $cnt = $pml->show();
if ($cnt == 0) { if ($cnt == 0) {
$this->element('p', null, _('(None)')); $this->element('p', null, _('(None)'));

View File

@ -49,23 +49,19 @@ class ProfileList extends Widget
{ {
/** Current profile, profile query. */ /** Current profile, profile query. */
var $profile = null; var $profile = null;
/** Owner of this list */
var $owner = null;
/** Action object using us. */ /** Action object using us. */
var $action = null; var $action = null;
function __construct($profile, $owner=null, $action=null) function __construct($profile, $action=null)
{ {
parent::__construct($action); parent::__construct($action);
$this->profile = $profile; $this->profile = $profile;
$this->owner = $owner;
$this->action = $action; $this->action = $action;
} }
function show() function show()
{ {
$this->out->elementStart('ul', 'profiles'); $this->out->elementStart('ul', 'profiles');
$cnt = 0; $cnt = 0;
@ -75,7 +71,8 @@ class ProfileList extends Widget
if($cnt > PROFILES_PER_PAGE) { if($cnt > PROFILES_PER_PAGE) {
break; break;
} }
$this->showProfile(); $pli = $this->newListItem($this->profile);
$pli->show();
} }
$this->out->elementEnd('ul'); $this->out->elementEnd('ul');
@ -83,16 +80,59 @@ class ProfileList extends Widget
return $cnt; return $cnt;
} }
function showProfile() function newListItem($profile)
{
return new ProfileListItem($this->profile, $this->action);
}
}
class ProfileListItem extends Widget
{
/** Current profile. */
var $profile = null;
/** Action object using us. */
var $action = null;
function __construct($profile, $action)
{
parent::__construct($action);
$this->profile = $profile;
$this->action = $action;
}
function show()
{
$this->startItem();
$this->showProfile();
$this->showActions();
$this->endItem();
}
function startItem()
{ {
$this->out->elementStart('li', array('class' => 'profile', $this->out->elementStart('li', array('class' => 'profile',
'id' => 'profile-' . $this->profile->id)); 'id' => 'profile-' . $this->profile->id));
}
$user = common_current_user(); function showProfile()
$is_own = !is_null($user) && isset($this->owner) && ($user->id === $this->owner->id); {
$this->startProfile();
$this->showAvatar();
$this->showFullName();
$this->showLocation();
$this->showHomepage();
$this->showBio();
$this->endProfile();
}
function startProfile()
{
$this->out->elementStart('div', 'entity_profile vcard'); $this->out->elementStart('div', 'entity_profile vcard');
}
function showAvatar()
{
$avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE); $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
$this->out->elementStart('a', array('href' => $this->profile->profileurl, $this->out->elementStart('a', array('href' => $this->profile->profileurl,
'class' => 'url')); 'class' => 'url'));
@ -108,7 +148,10 @@ class ProfileList extends Widget
$this->out->raw($this->highlight($this->profile->nickname)); $this->out->raw($this->highlight($this->profile->nickname));
$this->out->elementEnd('span'); $this->out->elementEnd('span');
$this->out->elementEnd('a'); $this->out->elementEnd('a');
}
function showFullName()
{
if (!empty($this->profile->fullname)) { if (!empty($this->profile->fullname)) {
$this->out->elementStart('dl', 'entity_fn'); $this->out->elementStart('dl', 'entity_fn');
$this->out->element('dt', null, 'Full name'); $this->out->element('dt', null, 'Full name');
@ -119,6 +162,10 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
function showLocation()
{
if (!empty($this->profile->location)) { if (!empty($this->profile->location)) {
$this->out->elementStart('dl', 'entity_location'); $this->out->elementStart('dl', 'entity_location');
$this->out->element('dt', null, _('Location')); $this->out->element('dt', null, _('Location'));
@ -127,6 +174,10 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
function showHomepage()
{
if (!empty($this->profile->homepage)) { if (!empty($this->profile->homepage)) {
$this->out->elementStart('dl', 'entity_url'); $this->out->elementStart('dl', 'entity_url');
$this->out->element('dt', null, _('URL')); $this->out->element('dt', null, _('URL'));
@ -138,6 +189,10 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
function showBio()
{
if (!empty($this->profile->bio)) { if (!empty($this->profile->bio)) {
$this->out->elementStart('dl', 'entity_note'); $this->out->elementStart('dl', 'entity_note');
$this->out->element('dt', null, _('Note')); $this->out->element('dt', null, _('Note'));
@ -146,57 +201,33 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
# If we're on a list with an owner (subscriptions or subscribers)... function endProfile()
{
if ($this->owner) {
# Get tags
$tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
$this->out->elementStart('dl', 'entity_tags');
$this->out->elementStart('dt');
if ($is_own) {
$this->out->element('a', array('href' => common_local_url('tagother',
array('id' => $this->profile->id))),
_('Tags'));
} else {
$this->out->text(_('Tags'));
}
$this->out->elementEnd('dt');
$this->out->elementStart('dd');
if ($tags) {
$this->out->elementStart('ul', 'tags xoxo');
foreach ($tags as $tag) {
$this->out->elementStart('li');
$this->out->element('span', 'mark_hash', '#');
$this->out->element('a', array('rel' => 'tag',
'href' => common_local_url($this->action->trimmed('action'),
array('nickname' => $this->owner->nickname,
'tag' => $tag))),
$tag);
$this->out->elementEnd('li');
}
$this->out->elementEnd('ul');
} else {
$this->out->text(_('(none)'));
}
$this->out->elementEnd('dd');
$this->out->elementEnd('dl');
}
if ($is_own) {
$this->showOwnerControls($this->profile);
}
$this->out->elementEnd('div'); $this->out->elementEnd('div');
}
function showActions()
{
$this->startActions();
$this->showSubscribeButton();
$this->endActions();
}
function startActions()
{
$this->out->elementStart('div', 'entity_actions'); $this->out->elementStart('div', 'entity_actions');
$this->out->elementStart('ul'); $this->out->elementStart('ul');
}
function showSubscribeButton()
{
// Is this a logged-in user, looking at someone else's // Is this a logged-in user, looking at someone else's
// profile? // profile?
$user = common_current_user();
if (!empty($user) && $this->profile->id != $user->id) { if (!empty($user) && $this->profile->id != $user->id) {
$this->out->elementStart('li', 'entity_subscribe'); $this->out->elementStart('li', 'entity_subscribe');
if ($user->isSubscribed($this->profile)) { if ($user->isSubscribed($this->profile)) {
@ -207,33 +238,22 @@ class ProfileList extends Widget
$sf->show(); $sf->show();
} }
$this->out->elementEnd('li'); $this->out->elementEnd('li');
$this->out->elementStart('li', 'entity_block');
if ($user->id == $this->owner->id) {
$this->showBlockForm();
}
$this->out->elementEnd('li');
} }
$this->out->elementEnd('ul');
$this->out->elementEnd('div');
$this->out->elementEnd('li');
} }
/* Override this in subclasses. */ function endActions()
function showOwnerControls($profile)
{ {
return; $this->out->elementEnd('ul');
$this->out->elementEnd('div');
}
function endItem()
{
$this->out->elementEnd('li');
} }
function highlight($text) function highlight($text)
{ {
return htmlspecialchars($text); return htmlspecialchars($text);
} }
function showBlockForm()
{
}
} }

View File

@ -47,26 +47,15 @@ define('PROFILES_PER_MINILIST', 27);
class ProfileMiniList extends ProfileList class ProfileMiniList extends ProfileList
{ {
function show() function newListItem($profile)
{ {
$this->out->elementStart('ul', 'entities users xoxo'); return new ProfileMiniListItem($profile, $this->action);
$cnt = 0;
while ($this->profile->fetch()) {
$cnt++;
if($cnt > PROFILES_PER_MINILIST) {
break;
}
$this->showProfile();
}
$this->out->elementEnd('ul');
return $cnt;
} }
}
function showProfile() class ProfileMiniListItem extends ProfileListItem
{
function show()
{ {
$this->out->elementStart('li', 'vcard'); $this->out->elementStart('li', 'vcard');
$this->out->elementStart('a', array('title' => $this->profile->getBestName(), $this->out->elementStart('a', array('title' => $this->profile->getBestName(),

131
lib/subscriptionlist.php Normal file
View File

@ -0,0 +1,131 @@
<?php
/**
* Laconica, the distributed open-source microblogging tool
*
* Widget to show a list of profiles
*
* 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 Laconica
* @author Evan Prodromou <evan@controlyourself.ca>
* @copyright 2008-2009 Control Yourself, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
*/
if (!defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/profilelist.php';
/**
* Widget to show a list of subscriptions
*
* @category Public
* @package Laconica
* @author Zach Copley <zach@controlyourself.ca>
* @author Evan Prodromou <evan@controlyourself.ca>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
*/
class SubscriptionList extends ProfileList
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner=null, $action=null)
{
parent::__construct($profile, $action);
$this->owner = $owner;
}
function newListItem($profile)
{
return new SubscriptionListItem($profile, $this->owner, $this->action);
}
}
class SubscriptionListItem extends ProfileListItem
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner, $action)
{
parent::__construct($profile, $action);
$this->owner = $owner;
}
function showProfile()
{
$this->startProfile();
$this->showAvatar();
$this->showFullName();
$this->showLocation();
$this->showHomepage();
$this->showBio();
// Relevant portion!
$this->showTags();
$this->endProfile();
}
function isOwn()
{
$user = common_current_user();
return (!empty($user) && ($this->owner->id == $user->id));
}
function showTags()
{
$tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
$this->out->elementStart('dl', 'entity_tags');
$this->out->elementStart('dt');
if ($this->isOwn()) {
$this->out->element('a', array('href' => common_local_url('tagother',
array('id' => $this->profile->id))),
_('Tags'));
} else {
$this->out->text(_('Tags'));
}
$this->out->elementEnd('dt');
$this->out->elementStart('dd');
if ($tags) {
$this->out->elementStart('ul', 'tags xoxo');
foreach ($tags as $tag) {
$this->out->elementStart('li');
$this->out->element('span', 'mark_hash', '#');
$this->out->element('a', array('rel' => 'tag',
'href' => common_local_url($this->action->trimmed('action'),
array('nickname' => $this->owner->nickname,
'tag' => $tag))),
$tag);
$this->out->elementEnd('li');
}
$this->out->elementEnd('ul');
} else {
$this->out->text(_('(none)'));
}
$this->out->elementEnd('dd');
$this->out->elementEnd('dl');
}
}