We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

Avatar.php 7.32 KB
Newer Older
Evan Prodromou's avatar
Evan Prodromou committed
1 2 3 4
<?php
/**
 * Table Definition for avatar
 */
5
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
Evan Prodromou's avatar
Evan Prodromou committed
6

7
class Avatar extends Managed_DataObject
Evan Prodromou's avatar
Evan Prodromou committed
8 9 10 11 12 13
{
    ###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    public $__table = 'avatar';                          // table name
    public $profile_id;                      // int(4)  primary_key not_null
14
    public $original;                        // tinyint(1)
Evan Prodromou's avatar
Evan Prodromou committed
15 16 17
    public $width;                           // int(4)  primary_key not_null
    public $height;                          // int(4)  primary_key not_null
    public $mediatype;                       // varchar(32)   not_null
18
    public $filename;                        // varchar(255)
Evan Prodromou's avatar
Evan Prodromou committed
19 20 21
    public $url;                             // varchar(255)  unique_key
    public $created;                         // datetime()   not_null
    public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
Evan Prodromou's avatar
Evan Prodromou committed
22 23 24

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE
25
	
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    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'),
            ),
        );
    }
52

53
    // We clean up the file, too
54 55
    function delete()
    {
56 57
        $filename = $this->filename;
        if (parent::delete()) {
58
            @unlink(Avatar::path($filename));
59 60
        }
    }
61

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    /*
     * 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.
79
        }
80 81

        return true;
82 83 84 85 86 87 88 89 90 91 92 93 94
    }

    public static function getOriginal(Profile $target)
    {
        $avatar = new Avatar();
        $avatar->profile_id = $target->id;
        $avatar->original = true;
        if (!$avatar->find(true)) {
            throw new NoResultException($avatar);
        }
        return $avatar;
    }

95
    public static function hasOriginal(Profile $profile) {
96 97 98 99 100 101 102 103
        try {
            $avatar = Avatar::getOriginal($profile);
        } catch (NoResultException $e) {
            return false;
        }
        return !file_exists(Avatar::path($avatar->filename));
    }

104 105 106
    public static function getProfileAvatars(Profile $target) {
        $avatar = new Avatar();
        $avatar->profile_id = $target->id;
107 108 109
        if (!$avatar->find()) {
            throw new NoResultException($avatar);
        }
110 111 112
        return $avatar->fetchAll();
    }

113 114 115
    /**
     * Where should the avatar go for this user?
     */
116 117 118 119 120 121 122 123 124 125 126
    static function filename($id, $extension, $size=null, $extra=null)
    {
        if ($size) {
            return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension;
        } else {
            return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension;
        }
    }

    static function path($filename)
    {
Evan Prodromou's avatar
Evan Prodromou committed
127 128 129 130 131 132 133
        $dir = common_config('avatar', 'dir');

        if ($dir[strlen($dir)-1] != '/') {
            $dir .= '/';
        }

        return $dir . $filename;
134 135 136 137
    }

    static function url($filename)
    {
Evan Prodromou's avatar
Evan Prodromou committed
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
        $path = common_config('avatar', 'path');

        if ($path[strlen($path)-1] != '/') {
            $path .= '/';
        }

        if ($path[0] != '/') {
            $path = '/'.$path;
        }

        $server = common_config('avatar', 'server');

        if (empty($server)) {
            $server = common_config('site', 'server');
        }
Zach Copley's avatar
Zach Copley committed
153

154 155 156 157 158 159 160 161 162 163 164 165
        $ssl = common_config('avatar', 'ssl');

        if (is_null($ssl)) { // null -> guess
            if (common_config('site', 'ssl') == 'always' &&
                !common_config('avatar', 'server')) {
                $ssl = true;
            } else {
                $ssl = false;
            }
        }

        $protocol = ($ssl) ? 'https' : 'http';
Evan Prodromou's avatar
Evan Prodromou committed
166

167
        return $protocol.'://'.$server.$path.$filename;
168 169 170 171 172
    }

    function displayUrl()
    {
        $server = common_config('avatar', 'server');
173
        if ($server && !empty($this->filename)) {
Evan Prodromou's avatar
Evan Prodromou committed
174
            return Avatar::url($this->filename);
175 176 177 178 179
        } else {
            return $this->url;
        }
    }

Evan Prodromou's avatar
Evan Prodromou committed
180
    static function defaultImage($size)
181 182 183 184
    {
        static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
                                  AVATAR_STREAM_SIZE => 'stream',
                                  AVATAR_MINI_SIZE => 'mini');
185
        return Theme::path('default-avatar-'.$sizenames[$size].'.png');
186
    }
187 188 189

    static function newSize(Profile $target, $size) {
        $size = floor($size);
190
        if ($size < 1 || $size > common_config('avatar', 'maxsize')) {
191
            // TRANS: An error message when avatar size is unreasonable
192
            throw new Exception(_m('Avatar size too large'));
193 194 195 196 197 198 199 200 201 202 203 204
        }

        $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);
205 206
        $scaled->filename = $filename;
        $scaled->created = common_sql_now();
207 208 209 210 211 212 213 214 215

        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;
    }
Evan Prodromou's avatar
Evan Prodromou committed
216
}