aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/profile_photo.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/profile_photo.rb')
-rw-r--r--app/models/profile_photo.rb54
1 files changed, 26 insertions, 28 deletions
diff --git a/app/models/profile_photo.rb b/app/models/profile_photo.rb
index 3c0be222c..61f88faf3 100644
--- a/app/models/profile_photo.rb
+++ b/app/models/profile_photo.rb
@@ -15,87 +15,84 @@
# Email: hello@mysociety.org; WWW: http://www.mysociety.org/
class ProfilePhoto < ActiveRecord::Base
+ # deliberately don't strip_attributes, so keeps raw photo properly
+
WIDTH = 96
HEIGHT = 96
-
MAX_DRAFT = 500 # keep even pre-cropped images reasonably small
belongs_to :user
validate :data_and_draft_checks
- # deliberately don't strip_attributes, so keeps raw photo properly
-
attr_accessor :x, :y, :w, :h
-
attr_accessor :image
after_initialize :convert_data_to_image
# make image valid format and size
def convert_image
- if self.data.nil?
- return
- end
- if self.image.nil?
- return
- end
+ return if data.nil?
+ return if image.nil?
# convert to PNG if it isn't, and to right size
altered = false
- if self.image.format != 'PNG'
+ if image.format != 'PNG'
self.image.format = 'PNG'
altered = true
end
+
# draft images are before the user has cropped them
- if !self.draft && (image.columns != WIDTH || image.rows != HEIGHT)
+ if !draft && (image.columns != WIDTH || image.rows != HEIGHT)
# do any exact cropping (taken from Jcrop interface)
- if self.w && self.h
- image.crop!(self.x.to_i, self.y.to_i, self.w.to_i, self.h.to_i)
+ if w && h
+ image.crop!(x.to_i, y.to_i, w.to_i, h.to_i)
end
# do any further cropping
image.resize_to_fill!(WIDTH, HEIGHT)
altered = true
end
- if self.draft && (image.columns > MAX_DRAFT || image.rows > MAX_DRAFT)
+
+ if draft && (image.columns > MAX_DRAFT || image.rows > MAX_DRAFT)
image.resize_to_fit!(MAX_DRAFT, MAX_DRAFT)
altered = true
end
+
if altered
- write_attribute(:data, self.image.to_blob)
+ write_attribute(:data, image.to_blob)
end
end
private
def data_and_draft_checks
- if self.data.nil?
+ if data.nil?
errors.add(:data, _("Please choose a file containing your photo."))
return
end
- if self.image.nil?
+ if image.nil?
errors.add(:data, _("Couldn't understand the image file that you uploaded. PNG, JPEG, GIF and many other common image file formats are supported."))
return
end
- if self.image.format != 'PNG'
+ if image.format != 'PNG'
errors.add(:data, _("Failed to convert image to a PNG"))
end
- if !self.draft && (self.image.columns != WIDTH || self.image.rows != HEIGHT)
+ if !draft && (image.columns != WIDTH || image.rows != HEIGHT)
errors.add(:data, _("Failed to convert image to the correct size: at {{cols}}x{{rows}}, need {{width}}x{{height}}",
- :cols => self.image.columns,
- :rows => self.image.rows,
+ :cols => image.columns,
+ :rows => image.rows,
:width => WIDTH,
:height => HEIGHT))
end
- if self.draft && self.user_id
+ if draft && user_id
raise "Internal error, draft pictures must not have a user"
end
- if !self.draft && !self.user_id
+ if !draft && !user_id
raise "Internal error, real pictures must have a user"
end
end
@@ -108,6 +105,7 @@ class ProfilePhoto < ActiveRecord::Base
end
image_list = Magick::ImageList.new
+
begin
image_list.from_blob(data)
rescue Magick::ImageMagickError
@@ -115,9 +113,9 @@ class ProfilePhoto < ActiveRecord::Base
return
end
- self.image = image_list[0] # TODO: perhaps take largest image or somesuch if there were multiple in the file?
- self.convert_image
+ # TODO: perhaps take largest image or somesuch if there were multiple
+ # in the file?
+ self.image = image_list[0]
+ convert_image
end
end
-
-