]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Avatar.php
Properly unlink all old avatars when deleting/uploading a new
[quix0rs-gnu-social.git] / classes / Avatar.php
index 636eb77f9cf87ba7a4f82db7c55f0652f0bfd731..782899de793ca597b4f8541018b408666f21beb0 100644 (file)
@@ -4,7 +4,7 @@
  */
 require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
-class Avatar extends Memcached_DataObject
+class Avatar extends Managed_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
@@ -20,15 +20,37 @@ class Avatar extends Memcached_DataObject
     public $created;                         // datetime()   not_null
     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 
-    /* Static get */
-    function staticGet($k,$v=null)
-    { return Memcached_DataObject::staticGet('Avatar',$k,$v); }
-
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
+       
+    public static function schemaDef()
+    {
+        return array(
+            'fields' => array(
+                'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'),
+                'original' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'uploaded by user or generated?'),
+                'width' => array('type' => 'int', 'not null' => true, 'description' => 'image width'),
+                'height' => array('type' => 'int', 'not null' => true, 'description' => 'image height'),
+                'mediatype' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'file type'),
+                'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'local filename, if local'),
+                'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'avatar location'),
+                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
+                'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
+            ),
+            'primary key' => array('profile_id', 'width', 'height'),
+            'unique keys' => array(
+                'avatar_url_key' => array('url'),
+            ),
+            'foreign keys' => array(
+                'avatar_profile_id_fkey' => array('profile', array('profile_id' => 'id')),
+            ),
+            'indexes' => array(
+                'avatar_profile_id_idx' => array('profile_id'),
+            ),
+        );
+    }
 
-    # We clean up the file, too
-
+    // We clean up the file, too
     function delete()
     {
         $filename = $this->filename;
@@ -37,9 +59,55 @@ class Avatar extends Memcached_DataObject
         }
     }
 
-    function pkeyGet($kv)
+    /*
+     * 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)
     {
-        return Memcached_DataObject::pkeyGet('Avatar', $kv);
+        $avatar = new Avatar();
+        $avatar->profile_id = $target->id;
+        $avatar->original = true;
+        if (!$avatar->find(true)) {
+            throw new NoResultException($avatar);
+        }
+        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();
     }
 
     /**
@@ -102,12 +170,8 @@ class Avatar extends Memcached_DataObject
     function displayUrl()
     {
         $server = common_config('avatar', 'server');
-        if ($server) {
-           if (common_config('avatar', 'server_modulo') && common_config('avatar', 'server_modulo') > 1 ){
-                return str_replace( '_rrdns_', ( $this->profile_id % common_config('avatar', 'server_modulo') ), Avatar::url($this->filename) );
-            }else{
-                return Avatar::url($this->filename);
-           }
+        if ($server && !empty($this->filename)) {
+            return Avatar::url($this->filename);
         } else {
             return $this->url;
         }
@@ -120,4 +184,33 @@ class Avatar extends Memcached_DataObject
                                   AVATAR_MINI_SIZE => 'mini');
         return Theme::path('default-avatar-'.$sizenames[$size].'.png');
     }
+
+    static function newSize(Profile $target, $size) {
+        $size = floor($size);
+        if ($size < 1 || $size > common_config('avatar', 'maxsize')) {
+            // TRANS: An error message when avatar size is unreasonable
+            throw new Exception(_m('Avatar size too large'));
+        }
+
+        $original = Avatar::getOriginal($target);
+
+        $imagefile = new ImageFile($target->id, Avatar::path($original->filename));
+        $filename = $imagefile->resize($size);
+
+        $scaled = clone($original);
+        $scaled->original = false;
+        $scaled->width = $size;
+        $scaled->height = $size;
+        $scaled->url = Avatar::url($filename);
+        $scaled->filename = $filename;
+        $scaled->created = common_sql_now();
+
+        if (!$scaled->insert()) {
+            // TRANS: An error message when unable to insert avatar data into the db
+            throw new Exception(_m('Could not insert new avatar data to database'));
+        }
+
+        // Return the new avatar object
+        return $scaled;
+    }
 }