]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
ShowprofiletagAction now extends ShowstreamAction
authorMikael Nordfeldth <mmn@hethane.se>
Sun, 27 Sep 2015 21:46:30 +0000 (23:46 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Sun, 27 Sep 2015 21:46:30 +0000 (23:46 +0200)
actions/showprofiletag.php
actions/showstream.php
classes/Profile.php
classes/Profile_list.php
lib/listsnav.php
lib/noticestreamaction.php
lib/peopletaggroupnav.php
lib/profileaction.php
lib/router.php
lib/util.php

index 09085ebf1a88e89a56028e8747a22700ef51af24..f99c9155e4c2f4c089656b76daddea6004a2ed7f 100644 (file)
 
 if (!defined('GNUSOCIAL')) { exit(1); }
 
-class ShowprofiletagAction extends Action
+class ShowprofiletagAction extends ShowstreamAction
 {
-    var $notice, $tagger, $peopletag, $userProfile;
+    var $notice, $peopletag;
 
-    function isReadOnly($args)
+    protected function doStreamPreparation()
     {
-        return true;
-    }
-
-    function prepare($args)
-    {
-        parent::prepare($args);
-
-        if (common_config('singleuser', 'enabled')) {
-            $tagger_arg = User::singleUserNickname();
-        } else {
-            $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('showprofiletag', $args), 301);
-        }
-
-        if (!$tagger) {
-            // TRANS: Client error displayed when a tagger is expected but not provided.
-            $this->clientError(_('No tagger.'), 404);
-        }
-
-        $user = User::getKV('nickname', $tagger);
-
-        if (!$user) {
-            // TRANS: Client error displayed trying to perform an action related to a non-existing user.
-            $this->clientError(_('No such user.'), 404);
-        }
-
-        $this->tagger = $user->getProfile();
-        $this->peopletag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag));
-
-        $current = common_current_user();
-        $can_see = !empty($this->peopletag) && (!$this->peopletag->private ||
-                   ($this->peopletag->private && $this->peopletag->tagger === $current->id));
-
-        if (!$can_see) {
+        $tag = common_canonical_tag($this->arg('tag'));
+        try {
+            $this->peopletag = Profile_list::getByPK(array('tagger' => $this->target->getID(), 'tag' => $tag));
+        } catch (NoResultException $e) {
             // TRANS: Client error displayed trying to reference a non-existing list.
-            $this->clientError(_('No such list.'), 404);
+            throw new ClientException('No such list.');
         }
 
-        $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-        $this->userProfile = Profile::current();
-
-        $stream = new PeopletagNoticeStream($this->peopletag, $this->userProfile);
-
-        $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE,
-                                            NOTICES_PER_PAGE + 1);
-
-        if ($this->page > 1 && $this->notice->N == 0) {
-            // TRANS: Client error when page not found (404).
-            $this->clientError(_('No such page.'), 404);
+        if ($this->peopletag->private && !$this->peopletag->getTagger()->sameAs($this->scoped)) {
+            // TRANS: Client error displayed trying to reference a non-existing list.
+            throw new AuthorizationException('You do not have permission to see this list.');
         }
-
-        return true;
     }
 
-    function handle($args)
+    public function getStream()
     {
-        parent::handle($args);
-
-        if (!$this->peopletag) {
-            // TRANS: Client error displayed trying to perform an action related to a non-existing user.
-            $this->clientError(_('No such user.'));
-        }
-
-        $this->showPage();
+        return new PeopletagNoticeStream($this->peopletag, $this->scoped);
     }
 
     function title()
@@ -130,7 +71,7 @@ class ShowprofiletagAction extends Action
             // TRANS: %1$s is a list, %2$s is the tagger's nickname, %3$d is a page number.
             return sprintf(_('Timeline for %1$s list by %2$s, page %3$d'),
                                 $this->peopletag->tag,
-                                $this->tagger->nickname,
+                                $this->target->getNickname(),
                                 $this->page
                           );
         } else {
@@ -153,7 +94,7 @@ class ShowprofiletagAction extends Action
             // TRANS: %1$s is a list, %2$s is the tagger's nickname.
             return sprintf(_('Timeline for %1$s list by %2$s'),
                                 $this->peopletag->tag,
-                                $this->tagger->nickname
+                                $this->target->getNickname()
                           );
         }
     }
@@ -164,29 +105,29 @@ class ShowprofiletagAction extends Action
         return array(new Feed(Feed::JSON,
                 common_local_url(
                     'ApiTimelineList', array(
-                        'user' => $this->tagger->id,
+                        'user' => $this->target->id,
                         'id' => $this->peopletag->id,
                         'format' => 'as'
                     )
                 ),
                 // TRANS: Feed title.
                 // TRANS: %s is tagger's nickname.
-                sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->tagger->nickname)),
+                sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->target->getNickname())),
                 new Feed(Feed::RSS2,
                 common_local_url(
                     'ApiTimelineList', array(
-                        'user' => $this->tagger->id,
+                        'user' => $this->target->id,
                         'id' => $this->peopletag->id,
                         'format' => 'rss'
                     )
                 ),
                 // TRANS: Feed title.
                 // TRANS: %s is tagger's nickname.
-                sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->tagger->nickname)),
+                sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->target->getNickname())),
             new Feed(Feed::ATOM,
                 common_local_url(
                     'ApiTimelineList', array(
-                        'user' => $this->tagger->id,
+                        'user' => $this->target->id,
                         'id' => $this->peopletag->id,
                         'format' => 'atom'
                     )
@@ -194,7 +135,7 @@ class ShowprofiletagAction extends Action
                 // TRANS: Feed title.
                 // TRANS: %1$s is a list, %2$s is tagger's nickname.
                 sprintf(_('Feed for %1$s list by %2$s (Atom)'),
-                            $this->peopletag->tag, $this->tagger->nickname
+                            $this->peopletag->tag, $this->target->getNickname()
                        )
               )
         );
@@ -212,11 +153,10 @@ class ShowprofiletagAction extends Action
         // TRANS: %1$s is a list, %2$s is a tagger's nickname.
         $message = sprintf(_('This is the timeline for %1$s list by %2$s but no one has posted anything yet.'),
                            $this->peopletag->tag,
-                           $this->tagger->nickname) . ' ';
+                           $this->target->getNickname()) . ' ';
 
         if (common_logged_in()) {
-            $current_user = common_current_user();
-            if ($this->tagger->id == $current_user->id) {
+            if ($this->target->sameAs($this->scoped)) {
                 // TRANS: Additional empty list message for list timeline for currently logged in user tagged tags.
                 $message .= _('Try tagging more people.');
             }
@@ -231,16 +171,15 @@ class ShowprofiletagAction extends Action
         $this->elementEnd('div');
     }
 
-    function showContent()
+    protected function showContent()
     {
         $this->showPeopletag();
-        $this->showNotices();
+        parent::showContent();
     }
 
     function showPeopletag()
     {
-        $cur = common_current_user();
-        $tag = new Peopletag($this->peopletag, $cur, $this);
+        $tag = new Peopletag($this->peopletag, $this->scoped, $this);
         $tag->show();
     }
 
@@ -260,7 +199,7 @@ class ShowprofiletagAction extends Action
                               $this->page,
                               'showprofiletag',
                               array('tag' => $this->peopletag->tag,
-                                    'tagger' => $this->tagger->nickname)
+                                    'nickname' => $this->target->getNickname())
             );
 
             Event::handle('EndShowProfileTagContent', array($this));
@@ -276,11 +215,6 @@ class ShowprofiletagAction extends Action
         # $this->showStatistics();
     }
 
-    function showPageTitle()
-    {
-        $this->element('h1', null, $this->title());
-    }
-
     function showTagged()
     {
         $profile = $this->peopletag->getTagged(0, PROFILES_PER_MINILIST + 1);
@@ -307,7 +241,7 @@ class ShowprofiletagAction extends Action
             if ($cnt > PROFILES_PER_MINILIST) {
                 $this->elementStart('p');
                 $this->element('a', array('href' => common_local_url('taggedprofiles',
-                                                                     array('nickname' => $this->tagger->nickname,
+                                                                     array('nickname' => $this->target->getNickname(),
                                                                            'profiletag' => $this->peopletag->tag)),
                                           'class' => 'more'),
                                // TRANS: Link for more "People in list x by a user"
index 890c1e711b316a99207fb7a2ac736cb2ba70264c..650efc7948e2d2945a4dfe072e11afebfbda9a7f 100644 (file)
@@ -85,7 +85,7 @@ class ShowstreamAction extends NoticestreamAction
         }
     }
 
-    function showContent()
+    protected function showContent()
     {
         $this->showNotices();
     }
index 09f9ca71d109933db6509cb883ec1bee866d222c..25a41bee72cb9b5b768be616035af9d78e5bada1 100644 (file)
@@ -1593,8 +1593,20 @@ class Profile extends Managed_DataObject
         return $this;
     }
 
-    public function sameAs(Profile $other)
+    /**
+     * Test whether the given profile is the same as the current class,
+     * for testing identities.
+     *
+     * @param Profile $other    The other profile, usually from Action's $this->scoped
+     *
+     * @return boolean
+     */
+    public function sameAs(Profile $other=null)
     {
+        if (is_null($other)) {
+            // In case $this->scoped is null or something, i.e. not a current/legitimate profile.
+            return false;
+        }
         return $this->getID() === $other->getID();
     }
 
index 2b3d2aa5ad4dd87e73f6d86bf94bb0f2886cb392..000e10b41f5fb7cc598c7c7a2d7ffa37378e98ed 100644 (file)
  * @license  GNU Affero General Public License http://www.gnu.org/licenses/
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
-
-/**
- * Table Definition for profile_list
- */
-require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 class Profile_list extends Managed_DataObject
 {
-    ###START_AUTOCODE
-    /* the code below is auto generated do not remove the above tag */
-
     public $__table = 'profile_list';                      // table name
     public $id;                              // int(4)  primary_key not_null
     public $tagger;                          // int(4)
@@ -48,9 +38,6 @@ class Profile_list extends Managed_DataObject
     public $tagged_count;                    // smallint
     public $subscriber_count;                // smallint
 
-    /* the code above is auto generated do not remove the tag below */
-    ###END_AUTOCODE
-
     public static function schemaDef()
     {
         return array(
@@ -94,7 +81,7 @@ class Profile_list extends Managed_DataObject
 
     function getTagger()
     {
-        return Profile::getKV('id', $this->tagger);
+        return Profile::getByID($this->tagger);
     }
 
     /**
@@ -145,7 +132,7 @@ class Profile_list extends Managed_DataObject
                 $url = $this->mainpage;
             } else {
                 $url = common_local_url('showprofiletag',
-                                        array('tagger' => $this->getTagger()->nickname,
+                                        array('nickname' => $this->getTagger()->nickname,
                                               'tag'    => $this->tag));
             }
         }
@@ -659,7 +646,7 @@ class Profile_list extends Managed_DataObject
             $orig = clone($ptag);
             $user = User::getKV('id', $ptag->tagger);
             if(!empty($user)) {
-                $ptag->mainpage = common_local_url('showprofiletag', array('tag' => $ptag->tag, 'tagger' => $user->nickname));
+                $ptag->mainpage = common_local_url('showprofiletag', array('tag' => $ptag->tag, 'nickname' => $user->getNickname()));
             } else {
                 $ptag->mainpage = $uri; // assume this is a remote peopletag and the uri works
             }
index a2fa0b8cd13acb36130b0718b649fe09c01d8a03..d550233ef5810864ee482df053c4b4b68f2e1c22 100644 (file)
@@ -66,7 +66,7 @@ class ListsNav extends MoreMenu
         while ($this->lists->fetch()) {
                 $mode = $this->lists->private ? 'private' : 'public';
                 $items[] = array('showprofiletag',
-                                 array('tagger' => $this->profile->nickname,
+                                 array('nickname' => $this->profile->getNickname(),
                                        'tag'    => $this->lists->tag),
                                  $this->lists->tag,
                                  '');
index ed8921860efa40744845d6d5f0c32ed01b15d7bf..bf09b637805b94c515debcdb311c2141dac0704c 100644 (file)
@@ -9,6 +9,9 @@ abstract class NoticestreamAction extends ProfileAction
     protected function prepare(array $args=array()) {
         parent::prepare($args);
 
+        // In case we need more info than ProfileAction->doPreparation() gives us
+        $this->doStreamPreparation();
+
         // fetch the actual stream stuff
         $stream = $this->getStream();
         $this->notice = $stream->getNotices(($this->page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
@@ -21,6 +24,11 @@ abstract class NoticestreamAction extends ProfileAction
         return true;
     }
 
+    protected function doStreamPreparation()
+    {
+        // pass by default
+    }
+
     // this fetches the NoticeStream
     abstract public function getStream();
 }
index 212a90586b096e4289c79f461c6ea72a7e6c3a5d..fb579affe09c77f73774aca20243fbd040713279 100644 (file)
@@ -76,7 +76,7 @@ class PeopletagGroupNav extends Widget
     {
         $user = null;
 
-       // FIXME: we should probably pass this in
+       // FIXME: we should probably pass this in and check when PeopletagGroupNav is actually loaded etc.
 
         $action = $this->action->trimmed('action');
 
@@ -107,7 +107,7 @@ class PeopletagGroupNav extends Widget
 
         if (Event::handle('StartPeopletagGroupNav', array($this))) {
             // People tag timeline
-            $this->out->menuItem(common_local_url('showprofiletag', array('tagger' => $user_profile->nickname,
+            $this->out->menuItem(common_local_url('showprofiletag', array('nickname' => $user_profile->nickname,
                                                                           'tag'    => $tag->tag)),
                              // TRANS: Menu item in list navigation panel.
                              _m('MENU','List'),
index 3dc28a7cc48fd56ec6f4de30588660373e2d1584..bdcd575b6b6b946cb5fa2ce2390960b4b60cd0f9 100644 (file)
@@ -315,7 +315,7 @@ abstract class ProfileAction extends ManagedAction
                         $url = $lists->mainpage;
                     } else {
                         $url = common_local_url('showprofiletag',
-                                                array('tagger' => $this->target->getNickname(),
+                                                array('nickname' => $this->target->getNickname(),
                                                       'tag'    => $lists->tag));
                     }
                     if (!$first) {
index b13c51c32834c92fb24facdbfeccc59454699871..28ee42662df5e3ec966f9400c38d422d9b1d1c35 100644 (file)
@@ -921,6 +921,7 @@ class Router
 
                 $m->connect('all/:tag',
                                 array('action' => 'showprofiletag',
+                                      'nickname' => $nickname,
                                       'tag' => self::REGEX_TAG));
 
                 foreach (array('subscriptions', 'subscribers') as $a) {
@@ -1003,9 +1004,9 @@ class Router
                                   'tagger_id' => '[0-9]+',
                                   'id' => '[0-9]+'));
 
-            $m->connect(':tagger/all/:tag',
-                            array('action' => 'showprofiletag',
-                                  'tagger' => Nickname::DISPLAY_FMT,
+            $m->connect(':nickname/all/:tag',
+                            array('action' => 'showprofiletag'),
+                            array('nickname' => Nickname::DISPLAY_FMT,
                                   'tag' => self::REGEX_TAG));
 
             foreach (array('subscriptions', 'subscribers') as $a) {
index 66847a435004815c1569deb0ee3fdc137ecf0eaf..9c37a5e669d11aab34e9aafe7a91814ace7a9d32 100644 (file)
@@ -786,7 +786,7 @@ function common_find_mentions($text, Notice $notice)
             $tagged = $sender->getTaggedSubscribers($tag);
 
             $url = common_local_url('showprofiletag',
-                                    array('tagger' => $sender->nickname,
+                                    array('nickname' => $sender->getNickname(),
                                           'tag' => $tag));
 
             $mentions[] = array('mentioned' => $tagged,