]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Properly unlink all old avatars when deleting/uploading a new
authorMikael Nordfeldth <mmn@hethane.se>
Tue, 1 Oct 2013 09:37:59 +0000 (11:37 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Tue, 1 Oct 2013 15:00:10 +0000 (17:00 +0200)
We're also now using $config['image']['jpegquality'] to determine the
quality setting for resized images.

To set Avatar max size, adjust $config['avatar']['maxsize']

The getAvatar call now throws exceptions too. Related changes applied.
Now let's move Profile->avatarUrl to the Avatar class!

47 files changed:
actions/allrss.php
actions/apitimelinefavorites.php
actions/apitimelinefriends.php
actions/apitimelinehome.php
actions/apitimelinementions.php
actions/apiuserprofileimage.php
actions/avatarbynickname.php
actions/avatarsettings.php
actions/foaf.php
actions/repliesrss.php
actions/shownotice.php
actions/tagprofile.php
actions/userrss.php
classes/Avatar.php
classes/Managed_DataObject.php
classes/Memcached_DataObject.php
classes/Profile.php
lib/accountprofileblock.php
lib/activityobject.php
lib/apiaction.php
lib/atomusernoticefeed.php
lib/default.php
lib/defaultprofileblock.php
lib/imagefile.php
lib/jsonsearchresultslist.php
lib/messagelistitem.php
lib/noresultexception.php
lib/noticelistitem.php
lib/noticesection.php
lib/peopletaglist.php
lib/profilelist.php
lib/profileminilist.php
lib/profilesection.php
lib/router.php
lib/togglepeopletag.php
lib/util.php
plugins/Autocomplete/actions/autocomplete.php
plugins/Bookmark/actions/apitimelinebookmarks.php
plugins/EmailSummary/lib/useremailsummaryhandler.php
plugins/GNUsocialProfileExtensions/actions/bio.php
plugins/GroupPrivateMessage/actions/showgroupmessage.php
plugins/GroupPrivateMessage/lib/groupmessagelistitem.php
plugins/OStatus/actions/ostatussub.php
plugins/QnA/actions/qnashowanswer.php
plugins/QnA/actions/qnashowquestion.php
plugins/SubMirror/forms/editmirror.php
plugins/TwitterBridge/lib/twitterimport.php

index 90e6f7a86aa01d5d02343d4cc6c8d0e5fb9ae10d..3db19ffdcce54e0e615a828ef8e80d0b73960d1c 100644 (file)
@@ -129,7 +129,6 @@ class AllrssAction extends Rss10Action
         if (!$profile) {
             return null;
         }
-        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-        return $avatar ? $avatar->url : null;
+        return $profile->avatarUrl(AVATAR_PROFILE_SIZE);
     }
 }
index 7e8dd7aad6e6bb0fefb058acb9dc111961072bdc..85f22d910bf514102183683d72ae1b5d7c4b6c35 100644 (file)
@@ -97,7 +97,6 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction
     function showTimeline()
     {
         $profile  = $this->user->getProfile();
-        $avatar   = $profile->getAvatar(AVATAR_PROFILE_SIZE);
 
         $sitename = common_config('site', 'name');
         $title    = sprintf(
@@ -120,15 +119,10 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction
             $profile->getBestName(),
             $this->user->nickname
         );
-        $logo = !empty($avatar)
-            ? $avatar->displayUrl()
-            : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-
-        $link = common_local_url(
-            'showfavorites',
-            array('nickname' => $this->user->nickname)
-        );
 
+        $logo = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
+        $link = common_local_url('showfavorites',
+                    array('nickname' => $this->user->nickname));
         $self = $this->getSelfUri();
 
         switch($this->format) {
index ed4cce490812714d2464e97019817e57f03e41c0..42cdde4c513d44e37f32ab8af155419372a5cdad 100644 (file)
@@ -200,7 +200,6 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
     function showTimeline()
     {
         $profile    = $this->user->getProfile();
-        $avatar     = $profile->getAvatar(AVATAR_PROFILE_SIZE);
         $sitename   = common_config('site', 'name');
         // TRANS: Title of API timeline for a user and friends.
         // TRANS: %s is a username.
@@ -215,17 +214,11 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
             $sitename
         );
 
-        $link = common_local_url(
-            'all',
-             array('nickname' => $this->user->nickname)
-        );
-
+        $logo = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
+        $link = common_local_url('all',
+                    array('nickname' => $this->user->nickname));
         $self = $this->getSelfUri();
 
-        $logo = (!empty($avatar))
-            ? $avatar->displayUrl()
-            : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-
         switch($this->format) {
         case 'xml':
             $this->showXmlTimeline($this->notices);
index 1ca74b208e7bc261780d2237d4a140282c640af6..7ef3da79f0de65c11471623fd693d392c5dcfd31 100644 (file)
@@ -105,7 +105,6 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
     function showTimeline()
     {
         $profile    = $this->user->getProfile();
-        $avatar     = $profile->getAvatar(AVATAR_PROFILE_SIZE);
         $sitename   = common_config('site', 'name');
         // TRANS: Timeline title for user and friends. %s is a user nickname.
         $title      = sprintf(_("%s and friends"), $this->user->nickname);
@@ -118,17 +117,11 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
             $this->user->nickname, $sitename
         );
 
-        $link = common_local_url(
-            'all',
-            array('nickname' => $this->user->nickname)
-        );
-
+        $logo = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
+        $link = common_local_url('all',
+                    array('nickname' => $this->user->nickname));
         $self = $this->getSelfUri();
 
-        $logo = (!empty($avatar))
-            ? $avatar->displayUrl()
-            : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-
         switch($this->format) {
         case 'xml':
             $this->showXmlTimeline($this->notices);
index 4ba8a4966b195a33043eb6e68219e25571e77111..aff4f318e945cf0ae940cc63e399d422b3696e7d 100644 (file)
@@ -104,7 +104,6 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
     function showTimeline()
     {
         $profile = $this->user->getProfile();
-        $avatar     = $profile->getAvatar(AVATAR_PROFILE_SIZE);
 
         $sitename   = common_config('site', 'name');
         $title      = sprintf(
@@ -115,11 +114,10 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
         );
         $taguribase = TagURI::base();
         $id         = "tag:$taguribase:Mentions:" . $this->user->id;
-        $link       = common_local_url(
-            'replies',
-            array('nickname' => $this->user->nickname)
-        );
 
+        $logo = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
+        $link = common_local_url('replies',
+                    array('nickname' => $this->user->nickname));
         $self = $this->getSelfUri();
 
         $subtitle   = sprintf(
@@ -129,7 +127,6 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
             _('%1$s updates that reply to updates from %2$s / %3$s.'),
             $sitename, $this->user->nickname, $profile->getBestName()
         );
-        $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
 
         switch($this->format) {
         case 'xml':
index 08af1789c6fab9c9ca9e6120fb001ed35e39860d..81b447f7e73f673e61ed67d01ff5ce21488a1040 100644 (file)
@@ -90,12 +90,7 @@ class ApiUserProfileImageAction extends ApiPrivateAuthAction
         }
 
         $size = $this->avatarSize();
-        $avatar = $profile->getAvatar($size);
-        if ($avatar) {
-            $url = $avatar->displayUrl();
-        } else {
-            $url = Avatar::defaultImage($size);
-        }
+        $url  = $profile->avatarUrl($size);
 
         // We don't actually output JSON or XML data -- redirect!
         common_redirect($url, 302);
index 487f66644ef646d1bda337650dcf1ee4183df576..5e02a4db3419ec41f9ae24687bf484c9f67c5dbd 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
  * Retrieve user avatar by nickname action class.
  *
  * @category Action
- * @package  StatusNet
+ * @package  GNUSocial
  * @author   Evan Prodromou <evan@status.net>
  * @author   Robin Millette <millette@status.net>
+ * @author   Mikael Nordfeldth <mmn@hethane.se>
  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
- * @link     http://status.net/
+ * @link     http://www.gnu.org/software/social/
  */
 class AvatarbynicknameAction extends Action
 {
@@ -51,55 +50,38 @@ class AvatarbynicknameAction extends Action
      *
      * @return boolean false if nickname or user isn't found
      */
-    function handle($args)
+    protected function handle()
     {
-        parent::handle($args);
+        parent::handle();
         $nickname = $this->trimmed('nickname');
         if (!$nickname) {
             // TRANS: Client error displayed trying to get an avatar without providing a nickname.
             $this->clientError(_('No nickname.'));
-            return;
-        }
-        $size = $this->trimmed('size');
-        if (!$size) {
-            // TRANS: Client error displayed trying to get an avatar without providing an avatar size.
-            $this->clientError(_('No size.'));
-            return;
-        }
-        $size = strtolower($size);
-        if (!in_array($size, array('original', '96', '48', '24'))) {
-            // TRANS: Client error displayed trying to get an avatar providing an invalid avatar size.
-            $this->clientError(_('Invalid size.'));
-            return;
         }
+        $size = $this->trimmed('size') ?: 'original';
 
         $user = User::getKV('nickname', $nickname);
         if (!$user) {
             // TRANS: Client error displayed trying to get an avatar for a non-existing user.
             $this->clientError(_('No such user.'));
-            return;
         }
         $profile = $user->getProfile();
         if (!$profile) {
             // TRANS: Error message displayed when referring to a user without a profile.
             $this->clientError(_('User has no profile.'));
-            return;
-        }
-        if ($size == 'original') {
-            $avatar = $profile->getOriginal();
-        } else {
-            $avatar = $profile->getAvatar($size+0);
         }
 
-        if ($avatar) {
-            $url = $avatar->url;
-        } else {
-            if ($size == 'original') {
+        if ($size === 'original') {
+            try {
+                $avatar = Avatar::getOriginal($profile);
+                $url = $avatar->url;
+            } catch (Exception $e) {
                 $url = Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-            } else {
-                $url = Avatar::defaultImage($size+0);
             }
+        } else {
+            $url = $profile->avatarUrl($size);
         }
+
         common_redirect($url, 302);
     }
 
index 77c6681c3c8d0e548f8290992704802fafc6d6ee..1f4eec5f5d80ffca430dd340eb0684fc93db55f6 100644 (file)
@@ -140,9 +140,8 @@ class AvatarsettingsAction extends SettingsAction
                 // No original avatar found!
             }
 
-            $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-
-            if ($avatar) {
+            try {
+                $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
                 $this->elementStart('li', array('id' => 'avatar_preview',
                                                 'class' => 'avatar_view'));
                 // TRANS: Header on avatar upload page for thumbnail of to be used rendition of uploaded avatar (h2).
@@ -158,6 +157,8 @@ class AvatarsettingsAction extends SettingsAction
                     $this->submit('delete', _m('BUTTON','Delete'));
                 }
                 $this->elementEnd('li');
+            } catch (Exception $e) {
+                // No previously uploaded avatar to preview.
             }
 
             $this->elementStart('li', array ('id' => 'settings_attach'));
@@ -354,7 +355,7 @@ class AvatarsettingsAction extends SettingsAction
      *
      * @return void
      */
-    function cropAvatar()
+    public function cropAvatar()
     {
         $filedata = $_SESSION['FILEDATA'];
 
@@ -371,7 +372,7 @@ class AvatarsettingsAction extends SettingsAction
         $dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0;
         $dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$file_d;
         $dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$file_d;
-        $size = min($dest_w, $dest_h, MAX_ORIGINAL);
+        $size = floor(min($dest_w, $dest_h, MAX_ORIGINAL));
 
         $user = common_current_user();
         $profile = $user->getProfile();
index 7f76c222cb29951405c0675893c8dea45f8b5b08..ee6ef85ef63e464883aee199332a9e6c4985d936 100644 (file)
@@ -146,11 +146,13 @@ class FoafAction extends Action
             $this->elementStart('img');
             $this->elementStart('Image', array('rdf:about' => $avatar->url));
             foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
-                $scaled = $this->profile->getAvatar($size);
-                if (!$scaled->original) { // sometimes the original has one of our scaled sizes
+                try {
+                    $scaled = Avatar::getOriginal($this->profile);
                     $this->elementStart('thumbnail');
                     $this->element('Image', array('rdf:about' => $scaled->url));
                     $this->elementEnd('thumbnail');
+                } catch (Exception $e) {
+                    // This avatar did not exist
                 }
             }
             $this->elementEnd('Image');
index 0c71130718ac6205237eef3d72238d4aaee2b34d..8a8f64e0c2b40dcbe8cf0355f2801f07414d7ecd 100644 (file)
@@ -78,13 +78,8 @@ class RepliesrssAction extends Rss10Action
 
     function getImage()
     {
-        $user = $this->user;
-        $profile = $user->getProfile();
-        if (!$profile) {
-            return null;
-        }
-        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-        return ($avatar) ? $avatar->url : null;
+        $profile = $this->user->getProfile();
+        return $profile->avatarUrl(AVATAR_PROFILE_SIZE);
     }
 
     function isReadOnly($args)
index 3b3e50884ddf5c35f734559400904ef920cf9628..6a026d2d364ea63c55f5b40712b719ac3673c921 100644 (file)
@@ -102,7 +102,11 @@ class ShownoticeAction extends Action
 
         $this->user = User::getKV('id', $this->profile->id);
 
-        $this->avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
+        try {
+            $this->avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
+        } catch (Exception $e) {
+            $this->avatar = null;
+        }
 
         return true;
     }
@@ -317,10 +321,7 @@ class ShownoticeAction extends Action
             'title'=>'oEmbed'),null);
 
         // Extras to aid in sharing notices to Facebook
-        $avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
-        $avatarUrl = ($avatar) ?
-                     $avatar->displayUrl() :
-                     Avatar::defaultImage(AVATAR_PROFILE_SIZE);
+        $avatarUrl = $this->profile->avatarUrl(AVATAR_PROFILE_SIZE);
         $this->element('meta', array('property' => 'og:image',
                                      'content' => $avatarUrl));
         $this->element('meta', array('property' => 'og:description',
index 3acb9e4a865643b97f4fb2b962273af0a7f45984..e9d855c4978e7101b7661773f10d804dcb573fc2 100644 (file)
@@ -107,8 +107,8 @@ class TagprofileAction extends Action
             // TRANS: Header in list form.
             $this->element('h2', null, _('User profile'));
 
-            $avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
-            $this->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE),
+            $avatarUrl = $this->profile->avatarUrl(AVATAR_PROFILE_SIZE);
+            $this->element('img', array('src' => $avatarUrl,
                                         'class' => 'photo avatar entity_depiction',
                                         'width' => AVATAR_PROFILE_SIZE,
                                         'height' => AVATAR_PROFILE_SIZE,
index a688cbf371f2f0ceb2b1aa63ea17913a85eefd32..239b5e517455b3eebcf01c8b422bbf5e2fd5ed75 100644 (file)
@@ -102,14 +102,12 @@ class UserrssAction extends Rss10Action
     {
         $user = $this->user;
         $profile = $user->getProfile();
-        if (!$profile) {
-            common_log_db_error($user, 'SELECT', __FILE__);
-            // TRANS: Error message displayed when referring to a user without a profile.
-            $this->serverError(_('User has no profile.'));
+        try {
+            $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+            return $avatar->url;
+        } catch (Exception $e) {
             return null;
         }
-        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-        return ($avatar) ? $avatar->url : null;
     }
 
     // override parent to add X-SUP-ID URL
index 40f9bc6bc957aafc7005a77cf2e4853dcd0a3aaf..782899de793ca597b4f8541018b408666f21beb0 100644 (file)
@@ -49,8 +49,8 @@ class Avatar extends Managed_DataObject
             ),
         );
     }
-    // We clean up the file, too
 
+    // We clean up the file, too
     function delete()
     {
         $filename = $this->filename;
@@ -59,11 +59,26 @@ class Avatar extends Managed_DataObject
         }
     }
 
-    public static function deleteFromProfile(Profile $target) {
-        $avatars = Avatar::getProfileAvatars($target->id);
-        foreach ($avatars as $avatar) {
-            $avatar->delete();
+    /*
+     * Deletes all avatars (but may spare the original) from a profile.
+     * 
+     * @param   Profile $target     The profile we're deleting avatars of.
+     * @param   boolean $original   Whether original should be removed or not.
+     */
+    public static function deleteFromProfile(Profile $target, $original=true) {
+        try {
+            $avatars = self::getProfileAvatars($target);
+            foreach ($avatars as $avatar) {
+                if ($avatar->original && !$original) {
+                    continue;
+                }
+                $avatar->delete();
+            }
+        } catch (NoResultException $e) {
+            // There are no avatars to delete, a sort of success.
         }
+
+        return true;
     }
 
     public static function getOriginal(Profile $target)
@@ -77,9 +92,21 @@ class Avatar extends Managed_DataObject
         return $avatar;
     }
 
+    public static function hasOriginal($profile) {
+        try {
+            $avatar = Avatar::getOriginal($profile);
+        } catch (NoResultException $e) {
+            return false;
+        }
+        return !file_exists(Avatar::path($avatar->filename));
+    }
+
     public static function getProfileAvatars(Profile $target) {
         $avatar = new Avatar();
         $avatar->profile_id = $target->id;
+        if (!$avatar->find()) {
+            throw new NoResultException($avatar);
+        }
         return $avatar->fetchAll();
     }
 
@@ -160,9 +187,9 @@ class Avatar extends Managed_DataObject
 
     static function newSize(Profile $target, $size) {
         $size = floor($size);
-        if ($size <1 || $size > 999) {
+        if ($size < 1 || $size > common_config('avatar', 'maxsize')) {
             // TRANS: An error message when avatar size is unreasonable
-            throw new Exception(_m('Unreasonable avatar size'));
+            throw new Exception(_m('Avatar size too large'));
         }
 
         $original = Avatar::getOriginal($target);
@@ -175,7 +202,8 @@ class Avatar extends Managed_DataObject
         $scaled->width = $size;
         $scaled->height = $size;
         $scaled->url = Avatar::url($filename);
-        $scaled->created = DB_DataObject_Cast::dateTime();
+        $scaled->filename = $filename;
+        $scaled->created = common_sql_now();
 
         if (!$scaled->insert()) {
             // TRANS: An error message when unable to insert avatar data into the db
index ae37dd02eaa911f5846bc47f068c144fd31244a9..c005ce66624608263ccf699f992071387fdd6ebf 100644 (file)
@@ -111,7 +111,7 @@ abstract class Managed_DataObject extends Memcached_DataObject
     }
 
     /**
-     * Get a multi-instance object in an array
+     * Get a multi-instance object separated into an array
      *
      * This is a utility method to get multiple instances with a given set of
      * values for a specific key column. Usually used for the primary key when
index d5f19169079bac6aacffae9c28b79bc5a4babcfc..03c0b8a5237f72ee48d27aa7ff670547feddc297 100644 (file)
@@ -276,7 +276,6 @@ class Memcached_DataObject extends Safe_DataObject
             throw new NoResultException($i);
         }
 
-        sprintf(__CLASS__ . "() got {$i->N} results for class $cls key $keyCol");
         return $i;
     }
 
index a468c9912875fc37ef3436e5ebd9cc87a8d2646a..afb3df6a5b8cebf98f386aa24a93d2d2ac2ea801 100644 (file)
@@ -116,52 +116,47 @@ class Profile extends Managed_DataObject
         return true;
     }
 
-    protected $_avatars;
-
     public function getAvatar($width, $height=null)
     {
+        $width = (int) floor($width);
+
         if (is_null($height)) {
             $height = $width;
         }
 
-        $avatar = $this->_getAvatar($width);
-
-        if (empty($avatar)) {
-            if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) {
-                $avatar = Avatar::pkeyGet(
-                    array(
-                        'profile_id' => $this->id,
-                        'width'      => $width,
-                        'height'     => $height
-                    )
-                );
-                Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar));
-            }
-
-            // if-empty within an if-empty? Let's find a prettier solution...
-            if (empty($avatar)) {
-                // Obviously we can't find an avatar, so let's resize the original!
-                try {
-                    $avatar = Avatar::newSize($this, $width);
-                } catch (Exception $e) {
-                    // Could not generate a resized avatar. How do we handle it?
-                }
-            }
+        try {
+            return $this->_getAvatar($width);
+        } catch (Exception $e) {
+            $avatar = null;
+        }
+        
+        if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) {
+            $avatar = Avatar::pkeyGet(
+                array(
+                    'profile_id' => $this->id,
+                    'width'      => $width,
+                    'height'     => $height
+                )
+            );
+            Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar));
+        }
 
-            // cache the avatar for future use
-            $this->_fillAvatar($width, $avatar);
+        if (is_null($avatar)) {
+            // Obviously we can't find an avatar, so let's resize the original!
+            $avatar = Avatar::newSize($this, $width);
         }
 
+        // cache the avatar for future use
+        $this->_fillAvatar($width, $avatar);
+
         return $avatar;
     }
 
+    protected $_avatars = array();
+
     // XXX: @Fix me gargargar
     function _getAvatar($width)
     {
-        if (empty($this->_avatars)) {
-            $this->_avatars = array();
-        }
-
         // GAR! I cannot figure out where _avatars gets pre-filled with the avatar from
         // the previously used profile! Please shoot me now! --Zach
         if (array_key_exists($width, $this->_avatars)) {
@@ -171,7 +166,7 @@ class Profile extends Managed_DataObject
             }
         }
 
-        return null;
+        throw new Exception('No cached avatar available for size ');
     }
 
     protected function _fillAvatar($width, $avatar)
@@ -207,8 +202,8 @@ class Profile extends Managed_DataObject
         $avatar->created = DB_DataObject_Cast::dateTime(); # current time
 
         // XXX: start a transaction here
-
-        if (!$this->delete_avatars() || !$avatar->insert()) {
+        if (!Avatar::deleteFromProfile($this, true) || !$avatar->insert()) {
+            // If we can't delete the old avatars, let's abort right here.
             @unlink(Avatar::path($filename));
             return null;
         }
@@ -227,30 +222,6 @@ class Profile extends Managed_DataObject
         return $avatar;
     }
 
-    /**
-     * Delete attached avatars for this user from the database and filesystem.
-     * This should be used instead of a batch delete() to ensure that files
-     * get removed correctly.
-     *
-     * @param boolean $original true to delete only the original-size file
-     * @return <type>
-     */
-    function delete_avatars($original=true)
-    {
-        $avatar = new Avatar();
-        $avatar->profile_id = $this->id;
-        $avatar->find();
-        while ($avatar->fetch()) {
-            if ($avatar->original) {
-                if ($original == false) {
-                    continue;
-                }
-            }
-            $avatar->delete();
-        }
-        return true;
-    }
-
     /**
      * Gets either the full name (if filled) or the nickname.
      *
@@ -636,10 +607,11 @@ class Profile extends Managed_DataObject
 
     function avatarUrl($size=AVATAR_PROFILE_SIZE)
     {
-        $avatar = $this->getAvatar($size);
-        if ($avatar) {
+        $size = floor($size);
+        try {
+            $avatar = $this->getAvatar($size);
             return $avatar->displayUrl();
-        } else {
+        } catch (Exception $e) {
             return Avatar::defaultImage($size);
         }
     }
@@ -913,7 +885,7 @@ class Profile extends Managed_DataObject
         $this->_deleteMessages();
         $this->_deleteTags();
         $this->_deleteBlocks();
-        $this->delete_avatars();
+        Avatar::deleteFromProfile($this, true);
 
         // Warning: delete() will run on the batch objects,
         // not on individual objects.
index c63bded46a7f5392c0c81691d39920fbb74c79f8..36f1fee27143b8bb7c7b817ab74ece0e7bb59ae0 100644 (file)
@@ -60,13 +60,7 @@ class AccountProfileBlock extends ProfileBlock
 
     function avatar()
     {
-        $avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
-        if (empty($avatar)) {
-            $avatar = $this->profile->getAvatar(73);
-        }
-        return (!empty($avatar)) ?
-            $avatar->displayUrl() :
-            Avatar::defaultImage(AVATAR_PROFILE_SIZE);
+        return $this->profile->avatarUrl(AVATAR_PROFILE_SIZE);
     }
 
     function name()
index 0b29888083d03b04d7d5bdf47748d0faf873c7a7..102f3369b0fd4ec6c0fd530cbb7b6c6feab0f7fd 100644 (file)
@@ -474,27 +474,15 @@ class ActivityObject
 
             foreach ($sizes as $size) {
                 $alink  = null;
-                $avatar = $profile->getAvatar($size);
-
-                if (!empty($avatar)) {
+                try {
+                    $avatar = $profile->getAvatar($size);
                     $alink = AvatarLink::fromAvatar($avatar);
-                } else {
+                } catch (Exception $e) {
                     $alink = new AvatarLink();
                     $alink->type   = 'image/png';
                     $alink->height = $size;
                     $alink->width  = $size;
                     $alink->url    = Avatar::defaultImage($size);
-
-                    if ($size == AVATAR_PROFILE_SIZE) {
-                        // Hack for Twitter import: we don't have a 96x96 image,
-                        // but we do have a 73x73 image. For now, fake it with that.
-                        $avatar = $profile->getAvatar(73);
-                        if ($avatar) {
-                            $alink = AvatarLink::fromAvatar($avatar);
-                            $alink->height= $size;
-                            $alink->width = $size;
-                        }
-                    }
                 }
 
                 $object->avatarLinks[] = $alink;
index 54c082244841ddf85273a4b2376a985fbe110776..8fdf91a5ac2b67eec2e043293acb1d5d7315ca89 100644 (file)
@@ -214,9 +214,7 @@ class ApiAction extends Action
         $twitter_user['location'] = ($profile->location) ? $profile->location : null;
         $twitter_user['description'] = ($profile->bio) ? $profile->bio : null;
 
-        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-        $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() :
-            Avatar::defaultImage(AVATAR_STREAM_SIZE);
+        $twitter_user['profile_image_url'] = $profile->avatarUrl(AVATAR_STREAM_SIZE);
 
         $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null;
         $twitter_user['protected'] = (!empty($user) && $user->private_stream) ? true : false;
@@ -995,10 +993,13 @@ class ApiAction extends Action
         $entry['author-name'] = $from->getBestName();
         $entry['author-uri'] = $from->homepage;
 
-        $avatar = $from->getAvatar(AVATAR_STREAM_SIZE);
-
-        $entry['avatar']      = (!empty($avatar)) ? $avatar->url : Avatar::defaultImage(AVATAR_STREAM_SIZE);
-        $entry['avatar-type'] = (!empty($avatar)) ? $avatar->mediatype : 'image/png';
+        $entry['avatar'] = $from->avatarUrl(AVATAR_STREAM_SIZE);
+        try {
+            $avatar = $from->getAvatar(AVATAR_STREAM_SIZE);
+            $entry['avatar-type'] = $avatar->mediatype;
+        } catch (Exception $e) {
+            $entry['avatar-type'] = 'image/png';
+        }
 
         // RSS item specific
 
index fb0ac5f8313c88cd80504cfca650fb393d4a8d8d..5180725722d23dff75d5ff2315e1d9f2b3fdfdd9 100644 (file)
@@ -97,9 +97,7 @@ class AtomUserNoticeFeed extends AtomNoticeFeed
         );
         $this->setSubtitle($subtitle);
 
-        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-        $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-        $this->setLogo($logo);
+        $this->setLogo($profile->avatarUrl(AVATAR_PROFILE_SIZE));
 
         $this->setUpdated('now');
 
index 7aa50bc3d908574722b25ba98355ae6486df4483..cc81910b8974a6d1859b85a3201e895d2e87cc22 100644 (file)
@@ -131,11 +131,14 @@ $default =
               'restore' => true,
               'delete' => false,
               'move' => true),
+        'image' =>
+        array('jpegquality' => 85),
         'avatar' =>
         array('server' => null,
               'dir' => INSTALLDIR . '/avatar/',
               'path' => $_path . '/avatar/',
-              'ssl' => null),
+              'ssl' => null,
+              'maxsize' => 300),
         'background' =>
         array('server' => null,
               'dir' => INSTALLDIR . '/background/',
index 78c7c4a118ff7385bc96b5d3d27418fac2a08aa5..f451aa01883dfc618426804ccc34e0773b4d7e6b 100644 (file)
@@ -63,13 +63,7 @@ class DefaultProfileBlock extends AccountProfileBlock
 
     function avatar()
     {
-        $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
-        if (empty($avatar)) {
-            $avatar = $this->profile->getAvatar(73);
-        }
-        return (!empty($avatar)) ? 
-            $avatar->displayUrl() : 
-            Avatar::defaultImage(AVATAR_STREAM_SIZE);
+        return $this->profile->avatarUrl(AVATAR_STREAM_SIZE);
     }
 
     function location()
@@ -91,4 +85,4 @@ class DefaultProfileBlock extends AccountProfileBlock
     {
         return array();
     }
-}
\ No newline at end of file
+}
index 0e0672024782686cc66b3a34bfa73c93f7a0ba84..ae14654bfbdce81a91ed1c56cc248e047362bdb3 100644 (file)
@@ -247,7 +247,7 @@ class ImageFile
             imagegif($image_dest, $outpath);
             break;
          case IMAGETYPE_JPEG:
-            imagejpeg($image_dest, $outpath, 100);
+            imagejpeg($image_dest, $outpath, common_config('image', 'jpegquality'));
             break;
          case IMAGETYPE_PNG:
             imagepng($image_dest, $outpath);
index 7ae2b9953c0e1d63c78948d2ae101dbf5ad7cac6..48540a4d587a56f76c8361ee7107efe147a9d74b 100644 (file)
@@ -243,10 +243,7 @@ class ResultItem
         
         $this->source = $this->getSourceLink($this->notice->source);
 
-        $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
-
-        $this->profile_image_url = ($avatar) ?
-            $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
+        $this->profile_image_url = $this->profile->avatarUrl(AVATAR_STREAM_SIZE);
 
         $this->created_at = common_date_rfc2822($this->notice->created);
     }
index 9c9a0335c61d00f1dd7f5fb84f784efadb4f6493..2590d7df634c9d76e4aa9042ef840f82f7fbe62c 100644 (file)
@@ -76,10 +76,8 @@ abstract class MessageListItem extends Widget
         $this->out->elementStart('span', 'vcard author');
         $this->out->elementStart('a', array('href' => $profile->profileurl,
                                             'class' => 'url'));
-        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-        $this->out->element('img', array('src' => ($avatar) ?
-                                         $avatar->displayUrl() :
-                                         Avatar::defaultImage(AVATAR_STREAM_SIZE),
+        $avatarUrl = $profile->avatarUrl(AVATAR_STREAM_SIZE);
+        $this->out->element('img', array('src' => $avatarUrl,
                                          'class' => 'photo avatar',
                                          'width' => AVATAR_STREAM_SIZE,
                                          'height' => AVATAR_STREAM_SIZE,
index d84785228263527b61877d9a7aa47df5b138192c..61e1a1f75a2ca42c1aeba4706d91938b39ce1fc7 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * StatusNet, the distributed open-source microblogging tool
  *
- * class for an exception when a database lookup returns no results
+ * Class for an exception when a database lookup returns no results
  *
  * PHP version 5
  *
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  * @category  Exception
- * @package   StatusNet
+ * @package   GNUSocial
  * @author    Mikael Nordfeldth <mmn@hethane.se>
  * @copyright 2013 Free Software Foundation, Inc.
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
- * @link      http://status.net/
+ * @link      http://www.gnu.org/software/social/
  */
 
-if (!defined('GNUSOCIAL')) {
-    exit(1);
-}
-
-/**
- * Class for an exception when a local user is not found by certain criteria
- *
- * @category Exception
- * @package  StatusNet
- * @author   Mikael Nordfeldth <mmn@hethane.se>
- * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
- * @link     http://status.net/
- */
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 class NoResultException extends ServerException
 {
index f829f963ee3f8ddb30ab61a7158941625416b50f..8fa5c5dcd4de2bfcd9ce8a3f160c4c42080135ea 100644 (file)
@@ -327,11 +327,9 @@ class NoticeListItem extends Widget
     {
         $avatar_size = $this->avatarSize();
 
-        $avatar = $this->profile->getAvatar($avatar_size);
+        $avatarUrl = $this->profile->avatarUrl($avatar_size);
 
-        $this->out->element('img', array('src' => ($avatar) ?
-                                         $avatar->displayUrl() :
-                                         Avatar::defaultImage($avatar_size),
+        $this->out->element('img', array('src' => $avatarUrl,
                                          'class' => 'avatar photo',
                                          'width' => $avatar_size,
                                          'height' => $avatar_size,
index 2edd6e09a508db4877485856fe1cf16ab34f58bb..4c6aeb3b5dd3520eebb15b06f3ad980729454748 100644 (file)
@@ -78,14 +78,14 @@ class NoticeSection extends Section
         }
         $this->out->elementStart('li', 'hentry notice');
         $this->out->elementStart('div', 'entry-title');
-        $avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
         $this->out->elementStart('span', 'vcard author');
         $this->out->elementStart('a', array('title' => ($profile->fullname) ?
                                             $profile->fullname :
                                             $profile->nickname,
                                             'href' => $profile->profileurl,
                                             'class' => 'url'));
-        $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :  Avatar::defaultImage(AVATAR_MINI_SIZE)),
+        $avatarUrl = $profile->avatarUrl(AVATAR_MINI_SIZE);
+        $this->out->element('img', array('src' => $avatarUrl,
                                          'width' => AVATAR_MINI_SIZE,
                                          'height' => AVATAR_MINI_SIZE,
                                          'class' => 'avatar photo',
index 2d0797f85686000b6887ea3e61aca76c32cf5a5a..5c027d75869f6a9b539b54377e998d16cc4d4ddc 100644 (file)
@@ -283,11 +283,9 @@ class PeopletagListItem extends Widget
 
     function showAvatar($size=AVATAR_STREAM_SIZE)
     {
-        $avatar = $this->profile->getAvatar($size);
+        $avatarUrl = $this->profile->avatarUrl($size);
 
-        $this->out->element('img', array('src' => ($avatar) ?
-                                         $avatar->displayUrl() :
-                                         Avatar::defaultImage($size),
+        $this->out->element('img', array('src' => $avatarUrl,
                                          'class' => 'avatar photo',
                                          'width' => $size,
                                          'height' => $size,
index 313cf760731e9a72a41e2ffe5966269a7d01bd96..085690b9f7f4a33805789d42565e3f1d71ef1299 100644 (file)
@@ -199,10 +199,10 @@ class ProfileListItem extends Widget
 
     function showAvatar()
     {
-        $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+        $avatarUrl = $this->profile->avatarUrl(AVATAR_STREAM_SIZE);
         $aAttrs = $this->linkAttributes();
         $this->out->elementStart('a', $aAttrs);
-        $this->out->element('img', array('src' => (!empty($avatar)) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE),
+        $this->out->element('img', array('src' => $avatarUrl,
                                          'class' => 'photo avatar',
                                          'width' => AVATAR_STREAM_SIZE,
                                          'height' => AVATAR_STREAM_SIZE,
index 7418c89232ea8efe3bef897d72d0c3a52f69fc82..049754f721843991642b137bf172e7ae312edecb 100644 (file)
@@ -79,8 +79,8 @@ class ProfileMiniListItem extends ProfileListItem
             if (Event::handle('StartProfileListItemAvatar', array($this))) {
                 $aAttrs = $this->linkAttributes();
                 $this->out->elementStart('a', $aAttrs);
-                $avatar = $this->profile->getAvatar(AVATAR_MINI_SIZE);
-                $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :  Avatar::defaultImage(AVATAR_MINI_SIZE)),
+                $avatarUrl = $this->profile->avatarUrl(AVATAR_MINI_SIZE);
+                $this->out->element('img', array('src' => $avatarUrl,
                                                  'width' => AVATAR_MINI_SIZE,
                                                  'height' => AVATAR_MINI_SIZE,
                                                  'class' => 'avatar photo',
index a9482cd634cff9783d199d0fc9957e87808de590..676fcd35402d47a33f53902856239b262ee7a239 100644 (file)
@@ -86,8 +86,8 @@ class ProfileSection extends Section
                                        'rel' => 'contact member',
                                        'class' => 'url'));
         $this->out->text(' ');
-        $avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
-        $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :  Avatar::defaultImage(AVATAR_MINI_SIZE)),
+        $avatarUrl = $profile->avatarUrl(AVATAR_MINI_SIZE);
+        $this->out->element('img', array('src' => $avatarUrl,
                                     'width' => AVATAR_MINI_SIZE,
                                     'height' => AVATAR_MINI_SIZE,
                                     'class' => 'avatar photo',
index e6a45a595633a7d41e8c9722b8b84c72771d2476..0180594e26ecdf9350d3c093dd1981bbb3f1eefc 100644 (file)
@@ -875,10 +875,13 @@ class Router
                             array('action' => 'showfavorites',
                                   'nickname' => $nickname));
 
+                $m->connect('avatar',
+                            array('action' => 'avatarbynickname',
+                                  'nickname' => $nickname));
                 $m->connect('avatar/:size',
                             array('action' => 'avatarbynickname',
                                   'nickname' => $nickname),
-                            array('size' => '(original|96|48|24)'));
+                            array('size' => '(|original|\d+)'));
 
                 $m->connect('tag/:tag/rss',
                             array('action' => 'userrss',
@@ -1047,9 +1050,12 @@ class Router
                             array('action' => 'showfavorites'),
                             array('nickname' => Nickname::DISPLAY_FMT));
 
+                $m->connect(':nickname/avatar',
+                            array('action' => 'avatarbynickname'),
+                            array('nickname' => Nickname::DISPLAY_FMT));
                 $m->connect(':nickname/avatar/:size',
                             array('action' => 'avatarbynickname'),
-                            array('size' => '(original|96|48|24)',
+                            array('size' => '(|original|\d+)',
                                   'nickname' => Nickname::DISPLAY_FMT));
 
                 $m->connect(':nickname/tag/:tag/rss',
index 156ce30af5fbfeb3592c40894a412943f0224c07..fdbf2b7cdb959f4c769b8e78c2480372ff44f214 100644 (file)
@@ -306,9 +306,8 @@ class TaggedProfileItem extends Widget
         $this->out->elementStart('a', array('class' => 'url',
                                             'href' => $this->profile->profileurl,
                                             'title' => $this->profile->getBestName()));
-        $avatar = $this->profile->getAvatar(AVATAR_MINI_SIZE);
-        $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :
-                                         Avatar::defaultImage(AVATAR_MINI_SIZE)),
+        $avatarUrl = $this->profile->avatarUrl(AVATAR_MINI_SIZE);
+        $this->out->element('img', array('src' => $avatarUrl,
                                          'width' => AVATAR_MINI_SIZE,
                                          'height' => AVATAR_MINI_SIZE,
                                          'class' => 'avatar photo',
index 2e9ba29ff37123461b9b1b1a0da87c37e839208c..abdd5c92070c9973b92dcdf83ab8d10f547b9e34 100644 (file)
@@ -2004,7 +2004,11 @@ function common_user_property($property)
         return $profile->$property;
         break;
     case 'avatar':
-        return $profile->getAvatar(AVATAR_STREAM_SIZE);
+        try {
+            return $profile->getAvatar(AVATAR_STREAM_SIZE);
+        } catch (Exception $e) {
+            return null;
+        }
         break;
     case 'bestname':
         return $profile->getBestName();
index 2e66fec93dad4ac8bcc8a78c7afbce397bf4af2c..a82379c7570a68c2cbe8ffff8e52f284a2ba920b 100644 (file)
@@ -141,33 +141,27 @@ class AutocompleteAction extends Action
         $results = array();
         foreach($this->users as $user){
             $profile = $user->getProfile();
-            $avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
-            // sigh.... encapsulate this upstream!
-            if ($avatar) {
-                $avatar = $avatar->displayUrl();
-            } else {
-                $avatar = Avatar::defaultImage(AVATAR_MINI_SIZE);
-            }
+            $avatarUrl = $profile->avatarUrl(AVATAR_MINI_SIZE);
             $results[] = array(
                 'value' => '@'.$profile->nickname,
                 'nickname' => $profile->nickname,
                 'label'=> $profile->getFancyName(),
-                'avatar' => $avatar,
+                'avatar' => $avatarUrl,
                 'type' => 'user'
             );
         }
         foreach($this->groups as $group){
             // sigh.... encapsulate this upstream!
             if ($group->mini_logo) {
-                $avatar = $group->mini_logo;
+                $avatarUrl = $group->mini_logo;
             } else {
-                $avatar = User_group::defaultLogo(AVATAR_MINI_SIZE);
+                $avatarUrl = User_group::defaultLogo(AVATAR_MINI_SIZE);
             }
             $results[] = array(
                 'value' => '!'.$group->nickname,
                 'nickname' => $group->nickname,
                 'label'=> $group->getFancyName(),
-                'avatar' => $avatar,
+                'avatar' => $avatarUrl,
                 'type' => 'group');
         }
         print json_encode($results);
index 58aac5d21c0e193f7d1d210c1d1d4774bafd76c7..4cc0dcde7f74d2bacd549e43553aba338f804557 100644 (file)
@@ -97,7 +97,6 @@ class ApiTimelineBookmarksAction extends ApiBareAuthAction
     function showTimeline()
     {
         $profile  = $this->user->getProfile();
-        $avatar   = $profile->getAvatar(AVATAR_PROFILE_SIZE);
 
         $sitename = common_config('site', 'name');
         $title    = sprintf(
@@ -120,15 +119,10 @@ class ApiTimelineBookmarksAction extends ApiBareAuthAction
             $profile->getBestName(),
             $this->user->nickname
         );
-        $logo = !empty($avatar)
-            ? $avatar->displayUrl()
-            : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-
-        $link = common_local_url(
-            'bookmarks',
-            array('nickname' => $this->user->nickname)
-        );
 
+        $logo = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
+        $link = common_local_url('bookmarks',
+                                array('nickname' => $this->user->nickname));
         $self = $this->getSelfUri();
 
         switch($this->format) {
index 46275c39c49b656760fb71eb1b828ab0f5fdf764..01f6ca826424425804f2ed452d92cfdb18cda709 100644 (file)
@@ -151,7 +151,7 @@ class UserEmailSummaryHandler extends QueueHandler
                 continue;
             }
 
-            $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+            $avatarUrl = $profile->avatarUrl(AVATAR_STREAM_SIZE);
 
             $out->elementStart('tr');
             $out->elementStart('td', array('width' => AVATAR_STREAM_SIZE,
@@ -159,9 +159,7 @@ class UserEmailSummaryHandler extends QueueHandler
                                            'align' => 'left',
                                            'valign' => 'top',
                                            'style' => 'border-bottom: 1px dotted #C5CEE3; padding: 10px 6px 10px 6px;'));
-            $out->element('img', array('src' => ($avatar) ?
-                                       $avatar->displayUrl() :
-                                       Avatar::defaultImage(AVATAR_STREAM_SIZE),
+            $out->element('img', array('src' => $avatarUrl,
                                        'width' => AVATAR_STREAM_SIZE,
                                        'height' => AVATAR_STREAM_SIZE,
                                        'alt' => $profile->getBestName()));
index 32460de426cccfb58a466b01008c9632b3489ec9..269389e07dff451c2de832f3564745fe4c15f279 100644 (file)
@@ -46,7 +46,6 @@ class BioAction extends Action
         $this->profile = Profile::getKV('nickname', $args[1]['nickname']);
         //die(print_r($this->profile));
         gnusocial_profile_merge($this->profile);
-        $this->avatar = $this->profile->getAvatar(96);
 
         return true;
 
index 8b99ece2758347fb812cedf60111209aabb6d2a0..4c2e7a71f6331e8752b18d584a5946527a6edb77 100644 (file)
@@ -174,9 +174,12 @@ class ShowgroupmessageAction extends Action
      */
     function etag()
     {
-        $avatar = $this->sender->getAvatar(AVATAR_STREAM_SIZE);
-
-        $avtime = ($avatar) ? strtotime($avatar->modified) : 0;
+        try {
+            $avatar = $this->sender->getAvatar(AVATAR_STREAM_SIZE);
+            $avtime = strtotime($avatar->modified);
+        } catch (Exception $e) {
+            $avtime = 0;
+        }
 
         return 'W/"' . implode(':', array($this->arg('action'),
                                           common_user_cache_hash(),
index cb9c6a5992d43ababd89e813bd921e885e282d97..741d621c3282b9064afb73c47854d4d69db16b6c 100644 (file)
@@ -78,10 +78,8 @@ class GroupMessageListItem extends Widget
         $this->out->elementStart('a',
                                  array('href' => $sender->profileurl,
                                        'class' => 'url'));
-        $avatar = $sender->getAvatar(AVATAR_STREAM_SIZE);
-        $this->out->element('img', array('src' => ($avatar) ?
-                                    $avatar->displayUrl() :
-                                    Avatar::defaultImage(AVATAR_STREAM_SIZE),
+        $avatarUrl = $sender->avatarUrl(AVATAR_STREAM_SIZE);
+        $this->out->element('img', array('src' => $avatarUrl,
                                     'width' => AVATAR_STREAM_SIZE,
                                     'height' => AVATAR_STREAM_SIZE,
                                     'class' => 'photo avatar',
index f27c3658b17683cb3284f233e7823fd1a7f7b9b8..2eeaac98de7ea9f2cdbd2f3d2fd116b902cc5606 100644 (file)
@@ -142,8 +142,7 @@ class OStatusSubAction extends Action
             $ok = true;
         }
 
-        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-        $avatarUrl = $avatar ? $avatar->displayUrl() : false;
+        $avatar = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
 
         $this->showEntity($profile,
                           $profile->profileurl,
@@ -159,10 +158,6 @@ class OStatusSubAction extends Action
         $homepage = $entity->homepage;
         $location = $entity->location;
 
-        if (!$avatar) {
-            $avatar = Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-        }
-
         $this->elementStart('div', 'entity_profile vcard');
         $this->element('img', array('src' => $avatar,
                                     'class' => 'photo avatar entity_depiction',
index 95a3c595df80a9727acab6840a6d04ed6b49d79b..ab432d97d9b5d61088c664827319bc3b18fc9c59 100644 (file)
@@ -96,7 +96,11 @@ class QnashowanswerAction extends ShownoticeAction
             throw new ServerException(_m('User without a profile.'));
         }
 
-        $this->avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
+        try {
+            $this->avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
+        } catch (Exception $e) {
+            $this->avatar = null;
+        }
 
         return true;
     }
index f030efadb2b28fba620457dfda5e135f47d09696..cc8f98448aa1e259f4d14bb96aba31ad43999cd3 100644 (file)
@@ -90,7 +90,11 @@ class QnashowquestionAction extends ShownoticeAction
             throw new ServerException(_m('User without a profile.'));
         }
 
-        $this->avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
+        try {
+            $this->avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
+        } catch (Exception $e) {
+            $this->avatar = null;
+        }
 
         return true;
     }
index 1fc13e8212059f78732658a27f44aa6078cbb706..704998057d67f91049681d575d4d6fd9b4f2dc48 100644 (file)
@@ -64,7 +64,7 @@ class EditMirrorForm extends Form
         $this->out->hidden('profile', $this->profile->id);
 
         $this->out->elementStart('div', array('style' => 'float: left; width: 80px;'));
-        $img = $this->getAvatar($this->profile);
+        $img = $this->profile->avatarUrl(AVATAR_STREAM_SIZE);
         $feed = $this->getFeed($this->profile);
         $this->out->elementStart('a', array('href' => $this->profile->profileurl));
         $this->out->element('img', array('src' => $img, 'style' => 'float: left'));
@@ -130,16 +130,6 @@ class EditMirrorForm extends Form
         $this->out->elementEnd('fieldset');
     }
 
-    private function getAvatar($profile)
-    {
-        $avatar = $this->profile->getAvatar(48);
-        if ($avatar) {
-            return $avatar->displayUrl();
-        } else {
-            return Avatar::defaultImage(48);
-        }
-    }
-
     private function getFeed($profile)
     {
         // Ok this is a bit of a hack. ;)
index cdfb8f8316b86686ee20b9be69cb02151c46d1c3..780fa8f92625c8ad66c40a888422e9c58944fb8e 100644 (file)
@@ -341,7 +341,14 @@ class TwitterImport
 
         $newname = 'Twitter_' . $twitter_user->id . '_' . basename($twitter_user->profile_image_url);
 
-        $oldname = $profile->getAvatar(48)->filename;
+        try {
+            $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+            $oldname = $avatar->filename;
+            unset($avatar);
+        } catch (Exception $e) {
+            $oldname = null;
+        }
+        
 
         if ($newname != $oldname) {
             common_debug($this->name() . ' - Avatar for Twitter user ' .
@@ -351,7 +358,7 @@ class TwitterImport
             $this->updateAvatars($twitter_user, $profile);
         }
 
-        if ($this->missingAvatarFile($profile)) {
+        if (Avatar::hasOriginal($profile)) {
             common_debug($this->name() . ' - Twitter user ' .
                          $profile->nickname .
                          ' is missing one or more local avatars.');
@@ -382,17 +389,6 @@ class TwitterImport
         }
     }
 
-    function missingAvatarFile($profile) {
-        foreach (array(24, 48, 73) as $size) {
-            $filename = $profile->getAvatar($size)->filename;
-            $avatarpath = Avatar::path($filename);
-            if (file_exists($avatarpath) == FALSE) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     function getMediatype($ext)
     {
         $mediatype = null;
@@ -447,13 +443,7 @@ class TwitterImport
             return;
         }
 
-        $sizes = array('mini' => 24, 'normal' => 48, 'bigger' => 73);
-        $avatar = $profile->getAvatar($sizes[$size]);
-
-        // Delete the avatar, if present
-        if ($avatar) {
-            $avatar->delete();
-        }
+        Avatar::deleteFromProfile($profile);
 
         $this->newAvatar($profile->id, $size, $mediatype, $filename);
     }