diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/user_controller.rb | 8 | ||||
-rw-r--r-- | app/models/profile_photo.rb | 88 | ||||
-rw-r--r-- | app/models/user.rb | 13 |
3 files changed, 107 insertions, 2 deletions
diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 6d3cb3480..cf1eb1d2c 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -4,7 +4,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: user_controller.rb,v 1.66 2009-04-23 12:17:06 tony Exp $ +# $Id: user_controller.rb,v 1.67 2009-08-05 16:31:10 francis Exp $ class UserController < ApplicationController # Show page about a user @@ -314,4 +314,10 @@ class UserController < ApplicationController render :action => 'confirm' # must be same as for send_confirmation_mail above to avoid leak of presence of email in db end + def set_profile_photo + @photo_user = User.find(params[:id]) + new_profile_photo = ProfilePhoto.new(:data => data) + @photo_user.set_profile_photo(new_profile_photo) + end end + diff --git a/app/models/profile_photo.rb b/app/models/profile_photo.rb new file mode 100644 index 000000000..23c85c133 --- /dev/null +++ b/app/models/profile_photo.rb @@ -0,0 +1,88 @@ +# models/profile_photo.rb: +# Image of user that goes on their profile. +# +# Copyright (c) 2009 UK Citizens Online Democracy. All rights reserved. +# Email: francis@mysociety.org; WWW: http://www.mysociety.org/ +# +# $Id: profile_photo.rb,v 1.1 2009-08-05 16:31:11 francis Exp $ +# +require 'mahoro' +require 'RMagick' + +class ProfilePhoto < ActiveRecord::Base + WIDTH = 96 + HEIGHT = 96 + + has_one :user + validates_presence_of :user + + # deliberately don't strip_attributes, so keeps raw photo properly + + # convert binary data blob into ImageMagick image when assigned + attr_accessor :image + def data=(data) + write_attribute(:data, data) + if data.nil? + self.image = nil + return + end + + image_list = Magick::ImageList.new + begin + image_list.from_blob(data) + rescue Magick::ImageMagickError + self.image = nil + write_attribute(:data, nil) + return + end + + self.image = image_list[0] # XXX perhaps take largest image or somesuch if there were multiple in the file? + self.convert_image + end + + # make image valid format and size + def convert_image + if self.data.nil? + return + end + if self.image.nil? + return + end + + # convert to PNG if it isn't, and to right size + altered = false + if self.image.format != 'PNG' + self.image.format = 'PNG' + altered = true + end + if image.columns != WIDTH || image.rows != HEIGHT + image.resize_to_fill!(WIDTH, HEIGHT) + altered = true + end + if altered + write_attribute(:data, self.image.to_blob) + end + end + + def validate + if self.data.nil? + errors.add(:data, "^No image specified") + return + end + + if self.image.nil? + errors.add(:data, "^Couldn't read the image that you uploaded, please try again.") + return + end + + if self.image.format != 'PNG' + errors.add(:data, "^Failed to convert image to a PNG") + end + + if self.image.columns != WIDTH || self.image.rows != HEIGHT + errors.add(:data, "^Failed to convert image to the correct size: at #{self.image.columns}x#{self.image.rows}, need #{WIDTH}x#{HEIGHT}") + end + end +end + + diff --git a/app/models/user.rb b/app/models/user.rb index 4853d633c..7bb5118ac 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,7 +23,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: user.rb,v 1.97 2009-07-03 11:43:37 francis Exp $ +# $Id: user.rb,v 1.98 2009-08-05 16:31:11 francis Exp $ require 'digest/sha1' @@ -42,6 +42,7 @@ class User < ActiveRecord::Base has_many :post_redirects has_many :track_things, :foreign_key => 'tracking_user_id', :order => 'created_at desc' has_many :comments, :order => 'created_at desc' + has_one :profile_photo attr_accessor :password_confirmation, :no_xapian_reindex validates_confirmation_of :password, :message =>"^Please enter the same password twice" @@ -254,6 +255,16 @@ class User < ActiveRecord::Base return PublicBody.extract_domain_from_email(self.email) end + def set_profile_photo(new_profile_photo) + ActiveRecord::Base.transaction do + if !self.profile_photo.nil? + self.profile_photo.destroy + end + new_profile_photo.user = self + self.profile_photo = new_profile_photo + end + end + private def self.encrypted_password(password, salt) |