From 5697e4edb0fc4bb1d4c9365100501e795b2553de Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 22 Mar 2010 10:35:54 -0700 Subject: Replace the "give up and dump object" attachment view fallback with a client-side redirect to the target URL, which will at least be useful. --- lib/attachmentlist.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/attachmentlist.php b/lib/attachmentlist.php index 51ceca857..fe38281af 100644 --- a/lib/attachmentlist.php +++ b/lib/attachmentlist.php @@ -306,7 +306,7 @@ class Attachment extends AttachmentListItem function showRepresentation() { if (empty($this->oembed->type)) { if (empty($this->attachment->mimetype)) { - $this->out->element('pre', null, 'oh well... not sure how to handle the following: ' . print_r($this->attachment, true)); + $this->showFallback(); } else { switch ($this->attachment->mimetype) { case 'image/gif': @@ -332,6 +332,8 @@ class Attachment extends AttachmentListItem $this->out->element('param', array('name' => 'autoStart', 'value' => 1)); $this->out->elementEnd('object'); break; + default: + $this->showFallback(); } } } else { @@ -354,9 +356,23 @@ class Attachment extends AttachmentListItem break; default: - $this->out->element('pre', null, 'oh well... not sure how to handle the following oembed: ' . print_r($this->oembed, true)); + $this->showFallback(); } } } + + function showFallback() + { + // If we don't know how to display an attachment inline, we probably + // shouldn't have gotten to this point. + // + // But, here we are... displaying details on a file or remote URL + // either on the main view or in an ajax-loaded lightbox. As a lesser + // of several evils, we'll try redirecting to the actual target via + // client-side JS. + + common_log(LOG_ERR, "Empty or unknown type for file id {$this->attachment->id}; falling back to client-side redirect."); + $this->out->raw(''); + } } -- cgit v1.2.3-54-g00ecf From b8e97ac7098783f0380c7f8f61c20a100e814dc0 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 22 Mar 2010 18:53:09 -0700 Subject: Some initial media parsing - Activity now returns a list of activity objects - Processing of photo objects --- lib/activity.php | 24 +-- lib/activityobject.php | 20 +++ plugins/OStatus/actions/groupsalmon.php | 3 +- plugins/OStatus/actions/usersalmon.php | 5 +- plugins/OStatus/classes/Ostatus_profile.php | 2 +- scripts/importtwitteratom.php | 2 +- tests/ActivityParseTests.php | 233 ++++++++++++++++++++++++++-- tests/UserFeedParseTest.php | 8 +- 8 files changed, 266 insertions(+), 31 deletions(-) (limited to 'lib') diff --git a/lib/activity.php b/lib/activity.php index bd1d5d56c..f9192c6b8 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -53,6 +53,7 @@ class Activity { const SPEC = 'http://activitystrea.ms/spec/1.0/'; const SCHEMA = 'http://activitystrea.ms/schema/1.0/'; + const MEDIA = 'http://purl.org/syndication/atommedia'; const VERB = 'verb'; const OBJECT = 'object'; @@ -85,7 +86,7 @@ class Activity public $actor; // an ActivityObject public $verb; // a string (the URL) - public $object; // an ActivityObject + public $objects = array(); // an array of ActivityObjects public $target; // an ActivityObject public $context; // an ActivityObject public $time; // Time of the activity @@ -161,12 +162,15 @@ class Activity // XXX: do other implied stuff here } - $objectEl = $this->_child($entry, self::OBJECT); + $objectEls = $entry->getElementsByTagNameNS(self::SPEC, self::OBJECT); - if (!empty($objectEl)) { - $this->object = new ActivityObject($objectEl); + if ($objectEls->length > 0) { + for ($i = 0; $i < $objectEls->length; $i++) { + $objectEl = $objectEls->item($i); + $this->objects[] = new ActivityObject($objectEl); + } } else { - $this->object = new ActivityObject($entry); + $this->objects[] = new ActivityObject($entry); } $actorEl = $this->_child($entry, self::ACTOR); @@ -280,8 +284,8 @@ class Activity } } - $this->object = new ActivityObject($item); - $this->context = new ActivityContext($item); + $this->objects[] = new ActivityObject($item); + $this->context = new ActivityContext($item); } /** @@ -339,8 +343,10 @@ class Activity $xs->element('activity:verb', null, $this->verb); - if ($this->object) { - $xs->raw($this->object->asString()); + if (!empty($this->objects)) { + foreach($this->objects as $object) { + $xs->raw($object->asString()); + } } if ($this->target) { diff --git a/lib/activityobject.php b/lib/activityobject.php index 0a358ccab..34d1b9170 100644 --- a/lib/activityobject.php +++ b/lib/activityobject.php @@ -100,6 +100,13 @@ class ActivityObject public $poco; public $displayName; + // @todo move this stuff to it's own PHOTO activity object + const MEDIA_DESCRIPTION = 'description'; + + public $thumbnail; + public $largerImage; + public $description; + /** * Constructor * @@ -150,6 +157,19 @@ class ActivityObject $this->poco = new PoCo($element); } + + if ($this->type == self::PHOTO) { + + $this->thumbnail = ActivityUtils::getLink($element, 'preview'); + $this->largerImage = ActivityUtils::getLink($element, 'enclosure'); + + $this->description = ActivityUtils::childContent( + $element, + ActivityObject::MEDIA_DESCRIPTION, + Activity::MEDIA + ); + + } } private function _fromAuthor($element) diff --git a/plugins/OStatus/actions/groupsalmon.php b/plugins/OStatus/actions/groupsalmon.php index 29377b5fa..d60725a71 100644 --- a/plugins/OStatus/actions/groupsalmon.php +++ b/plugins/OStatus/actions/groupsalmon.php @@ -60,7 +60,8 @@ class GroupsalmonAction extends SalmonAction function handlePost() { - switch ($this->act->object->type) { + // @fixme process all objects? + switch ($this->act->objects[0]->type) { case ActivityObject::ARTICLE: case ActivityObject::BLOGENTRY: case ActivityObject::NOTE: diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 15e8c1869..ecdcfa193 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -55,9 +55,10 @@ class UsersalmonAction extends SalmonAction */ function handlePost() { - common_log(LOG_INFO, "Received post of '{$this->act->object->id}' from '{$this->act->actor->id}'"); + common_log(LOG_INFO, "Received post of '{$this->act->objects[0]->id}' from '{$this->act->actor->id}'"); - switch ($this->act->object->type) { + // @fixme: process all activity objects? + switch ($this->act->objects[0]->type) { case ActivityObject::ARTICLE: case ActivityObject::BLOGENTRY: case ActivityObject::NOTE: diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 0eb5b8b82..df937643b 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -494,7 +494,7 @@ class Ostatus_profile extends Memcached_DataObject // It's not always an ActivityObject::NOTE, but... let's just say it is. - $note = $activity->object; + $note = $activity->objects[0]; // The id URI will be used as a unique identifier for for the notice, // protecting against duplicate saves. It isn't required to be a URL; diff --git a/scripts/importtwitteratom.php b/scripts/importtwitteratom.php index 7316f2108..c12e3b91a 100644 --- a/scripts/importtwitteratom.php +++ b/scripts/importtwitteratom.php @@ -102,7 +102,7 @@ function importActivityStream($user, $doc) for ($i = $entries->length - 1; $i >= 0; $i--) { $entry = $entries->item($i); $activity = new Activity($entry, $feed); - $object = $activity->object; + $object = $activity->objects[0]; if (!have_option('q', 'quiet')) { print $activity->content . "\n"; } diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php index 02d2ed734..fec8829eb 100644 --- a/tests/ActivityParseTests.php +++ b/tests/ActivityParseTests.php @@ -25,11 +25,11 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $this->assertEquals($act->time, 1243860840); $this->assertEquals($act->verb, ActivityVerb::POST); - $this->assertFalse(empty($act->object)); - $this->assertEquals($act->object->title, 'Punctuation Changeset'); - $this->assertEquals($act->object->type, 'http://versioncentral.example.org/activity/changeset'); - $this->assertEquals($act->object->summary, 'Fixing punctuation because it makes it more readable.'); - $this->assertEquals($act->object->id, 'tag:versioncentral.example.org,2009:/change/1643245'); + $this->assertFalse(empty($act->objects[0])); + $this->assertEquals($act->objects[0]->title, 'Punctuation Changeset'); + $this->assertEquals($act->objects[0]->type, 'http://versioncentral.example.org/activity/changeset'); + $this->assertEquals($act->objects[0]->summary, 'Fixing punctuation because it makes it more readable.'); + $this->assertEquals($act->objects[0]->id, 'tag:versioncentral.example.org,2009:/change/1643245'); } public function testExample3() @@ -56,12 +56,12 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $this->assertEquals($act->actor->title, 'John Doe'); $this->assertEquals($act->actor->id, 'mailto:johndoe@example.com'); - $this->assertFalse(empty($act->object)); - $this->assertEquals($act->object->type, ActivityObject::NOTE); - $this->assertEquals($act->object->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a'); - $this->assertEquals($act->object->title, 'Atom-Powered Robots Run Amok'); - $this->assertEquals($act->object->summary, 'Some text.'); - $this->assertEquals($act->object->link, 'http://example.org/2003/12/13/atom03.html'); + $this->assertFalse(empty($act->objects[0])); + $this->assertEquals($act->objects[0]->type, ActivityObject::NOTE); + $this->assertEquals($act->objects[0]->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a'); + $this->assertEquals($act->objects[0]->title, 'Atom-Powered Robots Run Amok'); + $this->assertEquals($act->objects[0]->summary, 'Some text.'); + $this->assertEquals($act->objects[0]->link, 'http://example.org/2003/12/13/atom03.html'); $this->assertFalse(empty($act->context)); @@ -90,8 +90,8 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $this->assertEquals('http://example.net/conversation/11', $act->context->conversation); $this->assertEquals(array('http://example.net/user/1'), $act->context->attention); - $this->assertFalse(empty($act->object)); - $this->assertEquals($act->object->content, + $this->assertFalse(empty($act->objects[0])); + $this->assertEquals($act->objects[0]->content, '@evan now is the time for all good men to come to the aid of their country. #'); $this->assertFalse(empty($act->actor)); @@ -215,6 +215,96 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $this->assertNull($actor->poco->address); $this->assertEquals(0, count($actor->poco->urls)); } + + // Media test - cliqset + public function testExample8() + { + global $_example8; + $dom = DOMDocument::loadXML($_example8); + + $feed = $dom->documentElement; + + $entries = $feed->getElementsByTagName('entry'); + + $entry = $entries->item(0); + + $act = new Activity($entry, $feed); + + $this->assertFalse(empty($act)); + $this->assertEquals($act->time, 1269221753); + $this->assertEquals($act->verb, ActivityVerb::POST); + $this->assertEquals($act->summary, 'zcopley posted 5 photos on Flickr'); + + $this->assertFalse(empty($act->objects)); + $this->assertEquals(sizeof($act->objects), 5); + + $this->assertEquals($act->objects[0]->type, ActivityObject::PHOTO); + $this->assertEquals($act->objects[0]->title, 'IMG_1368'); + $this->assertNull($act->objects[0]->description); + $this->assertEquals( + $act->objects[0]->thumbnail, + 'http://media.cliqset.com/6f6fbee9d7dfbffc73b6ef626275eb5f_thumb.jpg' + ); + $this->assertEquals( + $act->objects[0]->link, + 'http://www.flickr.com/photos/zcopley/4452933806/' + ); + + $this->assertEquals($act->objects[1]->type, ActivityObject::PHOTO); + $this->assertEquals($act->objects[1]->title, 'IMG_1365'); + $this->assertNull($act->objects[1]->description); + $this->assertEquals( + $act->objects[1]->thumbnail, + 'http://media.cliqset.com/b8f3932cd0bba1b27f7c8b3ef986915e_thumb.jpg' + ); + $this->assertEquals( + $act->objects[1]->link, + 'http://www.flickr.com/photos/zcopley/4442630390/' + ); + + $this->assertEquals($act->objects[2]->type, ActivityObject::PHOTO); + $this->assertEquals($act->objects[2]->title, 'Classic'); + $this->assertEquals( + $act->objects[2]->description, + '-Powered by pikchur.com/n0u' + ); + $this->assertEquals( + $act->objects[2]->thumbnail, + 'http://media.cliqset.com/fc54c15f850b7a9a8efa644087a48c91_thumb.jpg' + ); + $this->assertEquals( + $act->objects[2]->link, + 'http://www.flickr.com/photos/zcopley/4430754103/' + ); + + $this->assertEquals($act->objects[3]->type, ActivityObject::PHOTO); + $this->assertEquals($act->objects[3]->title, 'IMG_1363'); + $this->assertNull($act->objects[3]->description); + + $this->assertEquals( + $act->objects[3]->thumbnail, + 'http://media.cliqset.com/4b1d307c9217e2114391a8b229d612cb_thumb.jpg' + ); + $this->assertEquals( + $act->objects[3]->link, + 'http://www.flickr.com/photos/zcopley/4416969717/' + ); + + $this->assertEquals($act->objects[4]->type, ActivityObject::PHOTO); + $this->assertEquals($act->objects[4]->title, 'IMG_1361'); + $this->assertNull($act->objects[4]->description); + + $this->assertEquals( + $act->objects[4]->thumbnail, + 'http://media.cliqset.com/23d9b4b96b286e0347d36052f22f6e60_thumb.jpg' + ); + $this->assertEquals( + $act->objects[4]->link, + 'http://www.flickr.com/photos/zcopley/4417734232/' + ); + + } + } $_example1 = << EXAMPLE7; + +$_example8 = << + + + Activity Stream for: zcopley + http://cliqset.com/feed/atom?uid=zcopley + + 0 + http://activitystrea.ms/schema/1.0/post + 2010-03-22T01:35:53.000Z + + flickr + http://flickr.com + http://cliqset-services.s3.amazonaws.com/flickr.png + + + http://activitystrea.ms/schema/1.0/photo + IMG_1368 + + + + + http://activitystrea.ms/schema/1.0/photo + IMG_1365 + + + + + http://activitystrea.ms/schema/1.0/photo + Classic + + + -Powered by pikchur.com/n0u + + + http://activitystrea.ms/schema/1.0/photo + IMG_1363 + + + + + http://activitystrea.ms/schema/1.0/photo + IMG_1361 + + + + zcopley posted some photos on Flickr + zcopley posted 5 photos on Flickr + + 2010-03-22T20:46:42.778Z + tag:cliqset.com,2010-03-22:/user/zcopley/SVgAZubGhtAnSAee + + + zcopley + http://cliqset.com/user/zcopley + + + http://activitystrea.ms/schema/1.0/person + zcopley + + Zach + Copley + + + + + + + +EXAMPLE8; + +$_example9 = << + + + + Google Buzz + 2010-03-22T01:55:53.596Z + tag:google.com,2009:buzz-feed/public/posted/117848251937215158042 + Google - Google Buzz + + Buzz by Zach Copley from Flickr + IMG_1366 + 2010-03-18T04:29:23.000Z + 2010-03-18T05:14:03.325Z + tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0 + + + Zach Copley + http://www.google.com/profiles/zcopley + + <div>IMG_1366</div> + + + IMG_1366 + + + + + IMG_1365 + + + http://activitystrea.ms/schema/1.0/post + + http://activitystrea.ms/schema/1.0/photo + tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0 + Buzz by Zach Copley from Flickr + <div>IMG_1366</div> + + + + + 0 + + +EXAMPLE9; diff --git a/tests/UserFeedParseTest.php b/tests/UserFeedParseTest.php index b3f9a6417..208e71be6 100644 --- a/tests/UserFeedParseTest.php +++ b/tests/UserFeedParseTest.php @@ -66,11 +66,11 @@ class UserFeedParseTests extends PHPUnit_Framework_TestCase // test the post //var_export($act1); - $this->assertEquals($act1->object->type, 'http://activitystrea.ms/schema/1.0/note'); - $this->assertEquals($act1->object->title, 'And now for something completely insane...'); + $this->assertEquals($act1->objects[0]->type, 'http://activitystrea.ms/schema/1.0/note'); + $this->assertEquals($act1->objects[0]->title, 'And now for something completely insane...'); - $this->assertEquals($act1->object->content, 'And now for something completely insane...'); - $this->assertEquals($act1->object->id, 'http://localhost/statusnet/notice/3'); + $this->assertEquals($act1->objects[0]->content, 'And now for something completely insane...'); + $this->assertEquals($act1->objects[0]->id, 'http://localhost/statusnet/notice/3'); } -- cgit v1.2.3-54-g00ecf From 2d79455a1fb7627a23a6ca77fbab060193f6c43a Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Mar 2010 09:50:01 -0700 Subject: Don't add PHPSESSID parameter onto notice and conversation URIs if we save a notice during a session override. This was being triggered by welcomebot messages created at account creation time, then propagated through replies. --- classes/Conversation.php | 3 ++- lib/util.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/classes/Conversation.php b/classes/Conversation.php index ea8bd87b5..f540004ef 100755 --- a/classes/Conversation.php +++ b/classes/Conversation.php @@ -63,7 +63,8 @@ class Conversation extends Memcached_DataObject } $orig = clone($conv); - $orig->uri = common_local_url('conversation', array('id' => $id)); + $orig->uri = common_local_url('conversation', array('id' => $id), + null, null, false); $result = $orig->update($conv); if (empty($result)) { diff --git a/lib/util.php b/lib/util.php index a30d69100..795997868 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1529,7 +1529,8 @@ function common_user_uri(&$user) function common_notice_uri(&$notice) { return common_local_url('shownotice', - array('notice' => $notice->id)); + array('notice' => $notice->id), + null, null, false); } // 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits -- cgit v1.2.3-54-g00ecf From 80b16c8499d0cfdb4deb442ba18345befed4e29d Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Mar 2010 09:50:01 -0700 Subject: Don't add PHPSESSID parameter onto notice and conversation URIs if we save a notice during a session override. This was being triggered by welcomebot messages created at account creation time, then propagated through replies. --- classes/Conversation.php | 3 ++- lib/util.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/classes/Conversation.php b/classes/Conversation.php index ea8bd87b5..f540004ef 100755 --- a/classes/Conversation.php +++ b/classes/Conversation.php @@ -63,7 +63,8 @@ class Conversation extends Memcached_DataObject } $orig = clone($conv); - $orig->uri = common_local_url('conversation', array('id' => $id)); + $orig->uri = common_local_url('conversation', array('id' => $id), + null, null, false); $result = $orig->update($conv); if (empty($result)) { diff --git a/lib/util.php b/lib/util.php index 44ccc0def..3d4ed087f 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1521,7 +1521,8 @@ function common_user_uri(&$user) function common_notice_uri(&$notice) { return common_local_url('shownotice', - array('notice' => $notice->id)); + array('notice' => $notice->id), + null, null, false); } // 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits -- cgit v1.2.3-54-g00ecf From 533a3bf6a3180237cfffb8baf29ea3a3f7ec34f8 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Mar 2010 11:06:37 -0700 Subject: Consistently send Profiles into Fave::addNew() --- actions/apifavoritecreate.php | 2 +- classes/Fave.php | 10 +++++++++- lib/command.php | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/actions/apifavoritecreate.php b/actions/apifavoritecreate.php index 3618f9401..00b6349b0 100644 --- a/actions/apifavoritecreate.php +++ b/actions/apifavoritecreate.php @@ -123,7 +123,7 @@ class ApiFavoriteCreateAction extends ApiAuthAction return; } - $fave = Fave::addNew($this->user, $this->notice); + $fave = Fave::addNew($this->user->getProfile(), $this->notice); if (empty($fave)) { $this->clientError( diff --git a/classes/Fave.php b/classes/Fave.php index a04f15e9c..7ca9ade7f 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -21,7 +21,15 @@ class Fave extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - static function addNew($profile, $notice) { + /** + * Save a favorite record. + * @fixme post-author notification should be moved here + * + * @param Profile $profile the local or remote user who likes + * @param Notice $notice the notice that is liked + * @return mixed false on failure, or Fave record on success + */ + static function addNew(Profile $profile, Notice $notice) { $fave = null; diff --git a/lib/command.php b/lib/command.php index f7421269d..216f9e649 100644 --- a/lib/command.php +++ b/lib/command.php @@ -273,7 +273,7 @@ class FavCommand extends Command function handle($channel) { $notice = $this->getNotice($this->other); - $fave = Fave::addNew($this->user, $notice); + $fave = Fave::addNew($this->user->getProfile(), $notice); if (!$fave) { $channel->error($this->user, _('Could not create favorite.')); -- cgit v1.2.3-54-g00ecf From 44caa3a93f452777c795006edb52ef4c5c2c4997 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Mar 2010 11:06:37 -0700 Subject: Consistently send Profiles into Fave::addNew() --- actions/apifavoritecreate.php | 2 +- classes/Fave.php | 10 +++++++++- lib/command.php | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/actions/apifavoritecreate.php b/actions/apifavoritecreate.php index 3618f9401..00b6349b0 100644 --- a/actions/apifavoritecreate.php +++ b/actions/apifavoritecreate.php @@ -123,7 +123,7 @@ class ApiFavoriteCreateAction extends ApiAuthAction return; } - $fave = Fave::addNew($this->user, $this->notice); + $fave = Fave::addNew($this->user->getProfile(), $this->notice); if (empty($fave)) { $this->clientError( diff --git a/classes/Fave.php b/classes/Fave.php index a04f15e9c..7ca9ade7f 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -21,7 +21,15 @@ class Fave extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - static function addNew($profile, $notice) { + /** + * Save a favorite record. + * @fixme post-author notification should be moved here + * + * @param Profile $profile the local or remote user who likes + * @param Notice $notice the notice that is liked + * @return mixed false on failure, or Fave record on success + */ + static function addNew(Profile $profile, Notice $notice) { $fave = null; diff --git a/lib/command.php b/lib/command.php index 9d550550f..8080fb8bc 100644 --- a/lib/command.php +++ b/lib/command.php @@ -273,7 +273,7 @@ class FavCommand extends Command function handle($channel) { $notice = $this->getNotice($this->other); - $fave = Fave::addNew($this->user, $notice); + $fave = Fave::addNew($this->user->getProfile(), $notice); if (!$fave) { $channel->error($this->user, _('Could not create favorite.')); -- cgit v1.2.3-54-g00ecf From 16fa03212bc6cabe2f47e93d06c0def10d46b353 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Mar 2010 11:25:36 -0700 Subject: Ticket 2188: add a daily average post count to profile statistics sidebar. When we have more detailed history stats, this'd be a good place to link to details/graphs. --- lib/profileaction.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'lib') diff --git a/lib/profileaction.php b/lib/profileaction.php index 029c21845..072c024c7 100644 --- a/lib/profileaction.php +++ b/lib/profileaction.php @@ -169,6 +169,12 @@ class ProfileAction extends OwnerDesignAction $subbed_count = $this->profile->subscriberCount(); $notice_count = $this->profile->noticeCount(); $group_count = $this->user->getGroups()->N; + $age_days = (time() - strtotime($this->profile->created)) / 86400; + if ($age_days < 1) { + // Rather than extrapolating out to a bajillion... + $age_days = 1; + } + $daily_count = round($notice_count / $age_days); $this->elementStart('div', array('id' => 'entity_statistics', 'class' => 'section')); @@ -219,6 +225,12 @@ class ProfileAction extends OwnerDesignAction $this->element('dd', null, $notice_count); $this->elementEnd('dl'); + $this->elementStart('dl', 'entity_daily_notices'); + // TRANS: Average count of posts made per day since account registration + $this->element('dt', null, _('Daily average')); + $this->element('dd', null, $daily_count); + $this->elementEnd('dl'); + $this->elementEnd('div'); } -- cgit v1.2.3-54-g00ecf From abe4be5438180f5e4f7618f60112023e5ccd788e Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 23 Mar 2010 22:42:30 -0400 Subject: Use $param instead of hardcoded 'attach' name. --- lib/mediafile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/mediafile.php b/lib/mediafile.php index 10d90d008..1c96c42d7 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -171,7 +171,7 @@ class MediaFile return; } - if (!MediaFile::respectsQuota($user, $_FILES['attach']['size'])) { + if (!MediaFile::respectsQuota($user, $_FILES[$param]['size'])) { // Should never actually get here -- cgit v1.2.3-54-g00ecf From 647b3a1f6bff2f0c8f02ea65939ebde088742b16 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 24 Mar 2010 14:50:12 +0100 Subject: Moved print inside base stylesheet using media rules. One less HTTP GET. --- lib/action.php | 3 +-- theme/base/css/display.css | 32 ++++++++++++++++++++++++++++++++ theme/biz/css/base.css | 32 ++++++++++++++++++++++++++++++++ theme/biz/css/display.css | 3 ++- theme/cloudy/css/display.css | 30 ++++++++++++++++++++++++++++++ theme/default/css/display.css | 4 +++- theme/h4ck3r/css/base.css | 32 ++++++++++++++++++++++++++++++++ theme/h4ck3r/css/display.css | 5 ++++- theme/identica/css/display.css | 4 +++- theme/pigeonthoughts/css/base.css | 32 ++++++++++++++++++++++++++++++++ theme/pigeonthoughts/css/display.css | 4 +++- 11 files changed, 174 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/action.php b/lib/action.php index 491d7d481..09113a598 100644 --- a/lib/action.php +++ b/lib/action.php @@ -198,8 +198,7 @@ class Action extends HTMLOutputter // lawsuit if (Event::handle('StartShowStatusNetStyles', array($this)) && Event::handle('StartShowLaconicaStyles', array($this))) { - $this->cssLink('css/display.css',null,'screen, projection, tv'); - $this->cssLink('css/print.css','base','print'); + $this->cssLink('css/display.css',null, 'screen, projection, tv, print'); Event::handle('EndShowStatusNetStyles', array($this)); Event::handle('EndShowLaconicaStyles', array($this)); } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index d58684efb..36f0533b1 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -1688,3 +1689,34 @@ width:auto; #bookmarklet #wrap { min-width:0; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/biz/css/base.css b/theme/biz/css/base.css index 2c2ab33a0..43b8e4656 100644 --- a/theme/biz/css/base.css +++ b/theme/biz/css/base.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -1358,3 +1359,34 @@ display:none; .guide { clear:both; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/biz/css/display.css b/theme/biz/css/display.css index 3e97444f1..cafb152dc 100644 --- a/theme/biz/css/display.css +++ b/theme/biz/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(base.css); +@import url(base.css) screen, projection, tv, print; +@media screen, projection, tv { html { background-color:#144A6E; } diff --git a/theme/cloudy/css/display.css b/theme/cloudy/css/display.css index 5bc32e6d9..d9e9f3ce2 100644 --- a/theme/cloudy/css/display.css +++ b/theme/cloudy/css/display.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -2099,4 +2100,33 @@ border-left-color:#FFFFFF; #footer { background-color:#FFFFFF; } +}/*end of @media screen, projection, tv*/ + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/default/css/display.css b/theme/default/css/display.css index d7f15cc46..7ccd234cd 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(../../base/css/display.css); +@import url(../../base/css/display.css) screen, projection, tv, print; +@media screen, projection, tv { body, a:active { background-color:#CEE1E9; @@ -516,3 +517,4 @@ background-position:90% 47%; background-position:10% 47%; } +}/*end of @media screen, projection, tv*/ diff --git a/theme/h4ck3r/css/base.css b/theme/h4ck3r/css/base.css index 18ea742a5..0302653fd 100644 --- a/theme/h4ck3r/css/base.css +++ b/theme/h4ck3r/css/base.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -1137,3 +1138,34 @@ display:none; .guide { clear:both; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/h4ck3r/css/display.css b/theme/h4ck3r/css/display.css index 58b3f242a..7112765ab 100644 --- a/theme/h4ck3r/css/display.css +++ b/theme/h4ck3r/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(base.css); +@import url(base.css) screen, projection, tv, print; +@media screen, projection, tv { html, body, a:active { @@ -234,3 +235,5 @@ background-position:10% 45%; background-image:url(../../base/images/icons/twotone/green/arrow-right.gif); background-position:90% 45%; } + +}/*end of @media screen, projection, tv*/ diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index d9f39e780..3972657a7 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(../../base/css/display.css); +@import url(../../base/css/display.css) screen, projection, tv, print; +@media screen, projection, tv { body, a:active { background-color:#F0F2F5; @@ -515,3 +516,4 @@ background-position:90% 47%; background-position:10% 47%; } +}/*end of @media screen, projection, tv*/ diff --git a/theme/pigeonthoughts/css/base.css b/theme/pigeonthoughts/css/base.css index 2814260bd..bd12e6eaa 100644 --- a/theme/pigeonthoughts/css/base.css +++ b/theme/pigeonthoughts/css/base.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -1383,3 +1384,34 @@ display:none; .guide { clear:both; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/pigeonthoughts/css/display.css b/theme/pigeonthoughts/css/display.css index dfeb01b48..de5164ea8 100644 --- a/theme/pigeonthoughts/css/display.css +++ b/theme/pigeonthoughts/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(base.css); +@import url(base.css) screen, projection, tv, print; +@media screen, projection, tv { html { background:url(../images/illustrations/illu_pigeons-01.png) no-repeat 0 100%; } @@ -496,3 +497,4 @@ background-position:90% 47%; background-position:10% 47%; } +}/*end of @media screen, projection, tv*/ -- cgit v1.2.3-54-g00ecf From e7ae36b52a8192021f3a48f1a3929bbeee877ccd Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 24 Mar 2010 20:50:07 +0100 Subject: Updated tag list output in subscriptions list. Matches userprofile. --- lib/subscriptionlist.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/subscriptionlist.php b/lib/subscriptionlist.php index e1207774f..fc8f33f2e 100644 --- a/lib/subscriptionlist.php +++ b/lib/subscriptionlist.php @@ -113,12 +113,13 @@ class SubscriptionListItem extends ProfileListItem $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); + // Avoid space by using raw output. + $pt = '#'; + $this->out->raw($pt); $this->out->elementEnd('li'); } $this->out->elementEnd('ul'); -- cgit v1.2.3-54-g00ecf From 09ff213d1c6b8dc42f28b9c637431bafa54146ec Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 24 Mar 2010 20:58:13 +0100 Subject: Using hCard label instead of location. Matches userprofile. --- lib/profilelist.php | 2 +- theme/base/css/display.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/profilelist.php b/lib/profilelist.php index d970e605a..3e5513895 100644 --- a/lib/profilelist.php +++ b/lib/profilelist.php @@ -213,7 +213,7 @@ class ProfileListItem extends Widget { if (!empty($this->profile->location)) { $this->out->text(' '); - $this->out->elementStart('span', 'location'); + $this->out->elementStart('span', 'label'); $this->out->raw($this->highlight($this->profile->location)); $this->out->elementEnd('span'); } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 36f0533b1..b0ab02bce 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -926,7 +926,7 @@ display:inline; } .profile .entity_profile .fn, -.profile .entity_profile .location { +.profile .entity_profile .label { margin-left:11px; margin-bottom:4px; width:auto; -- cgit v1.2.3-54-g00ecf From a954fd65ba00328cd1a76e620113d2f639340aaf Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Mar 2010 13:36:57 -0700 Subject: Fix for API group methods, caused failure or output corruption when pulling up local groups by name in api/statusnet/groups/is_member.json/xml --- lib/apiaction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/apiaction.php b/lib/apiaction.php index e6aaf9316..9fc1a0779 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -1273,7 +1273,7 @@ class ApiAction extends Action if (empty($local)) { return null; } else { - return User_group::staticGet('id', $local->id); + return User_group::staticGet('id', $local->group_id); } } -- cgit v1.2.3-54-g00ecf