retrospring/app/models/user.rb

200 lines
6.1 KiB
Ruby
Raw Normal View History

2014-08-01 12:07:16 +02:00
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
2015-01-01 18:17:34 +01:00
devise :database_authenticatable, :async, :registerable,
2014-08-01 15:27:08 +02:00
:recoverable, :rememberable, :trackable,
:validatable, :authentication_keys => [:login]
2014-11-30 19:43:22 +01:00
2014-08-01 15:27:08 +02:00
# attr_accessor :login
2014-11-30 19:43:22 +01:00
2014-10-28 06:36:38 +01:00
has_many :questions, dependent: :destroy
has_many :answers, dependent: :destroy
has_many :comments, dependent: :destroy
2014-11-10 23:45:36 +01:00
has_many :inboxes, dependent: :destroy
2014-11-30 14:43:35 +01:00
has_many :active_relationships, class_name: 'Relationship',
foreign_key: 'source_id',
dependent: :destroy
has_many :passive_relationships, class_name: 'Relationship',
foreign_key: 'target_id',
dependent: :destroy
has_many :friends, through: :active_relationships, source: :target
has_many :followers, through: :passive_relationships, source: :source
2014-12-28 00:34:56 +01:00
has_many :smiles, dependent: :destroy
has_many :services, dependent: :destroy
has_many :notifications, foreign_key: :recipient_id, dependent: :destroy
2014-12-27 14:35:09 +01:00
has_many :reports, dependent: :destroy
2014-12-28 21:47:51 +01:00
has_many :moderation_comments, dependent: :destroy
has_many :moderation_votes, dependent: :destroy
2015-01-08 13:16:13 +01:00
has_many :groups, dependent: :destroy
2015-01-12 06:41:44 +01:00
has_many :group_memberships, class_name: "GroupMember", foreign_key: 'user_id', dependent: :destroy
2014-11-30 14:43:35 +01:00
2015-04-21 03:12:11 +02:00
has_many :subscriptions, dependent: :destroy
2014-08-01 15:27:08 +02:00
SCREEN_NAME_REGEX = /\A[a-zA-Z0-9_]{1,16}\z/
WEBSITE_REGEX = /https?:\/\/([A-Za-z.\-]+)\/?(?:.*)/i
2014-11-30 19:43:22 +01:00
before_validation do
screen_name.strip!
end
validates :screen_name, presence: true, format: { with: SCREEN_NAME_REGEX }, uniqueness: { case_sensitive: false }, screen_name: true
2014-12-12 18:52:56 +01:00
validates :display_name, length: { maximum: 50 }
2014-12-16 12:48:40 +01:00
validates :bio, length: { maximum: 200 }
2014-12-12 18:52:56 +01:00
2014-12-01 23:17:16 +01:00
# validates :website, format: { with: WEBSITE_REGEX }
2014-12-29 14:51:52 +01:00
has_attached_file :profile_picture, styles: { large: "500x500#", medium: "256x256#", small: "80x80#" },
default_url: "/images/:style/no_avatar.png", use_timestamp: false,
processors: [:cropper]
2014-12-29 10:18:12 +01:00
validates_attachment_content_type :profile_picture, :content_type => /\Aimage\/.*\Z/
2014-12-29 11:58:01 +01:00
process_in_background :profile_picture
2014-12-29 10:18:12 +01:00
2014-12-27 01:22:13 +01:00
before_save do
2014-12-27 01:45:24 +01:00
self.display_name = 'WRYYYYYYYY' if display_name == 'Dio Brando'
2014-12-27 01:22:13 +01:00
self.website = if website.match %r{\Ahttps?://}
website
else
"http://#{website}"
end unless website.blank?
end
2014-08-01 15:27:08 +02:00
def login=(login)
@login = login
end
def login
@login || self.screen_name || self.email
end
2014-11-30 19:43:22 +01:00
2014-08-01 15:27:08 +02:00
def self.find_first_by_auth_conditions(warden_conditions)
2015-04-22 00:33:55 +02:00
conditions = warden_conditions.dup
2014-08-01 15:27:08 +02:00
if login = conditions.delete(:login)
where(conditions).where(["lower(screen_name) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
2014-11-30 15:39:13 +01:00
# @return [Array] the users' timeline
def timeline
Answer.where("user_id in (?) OR user_id = ?", friend_ids, id).order(:created_at).reverse_order
end
# follows an user.
def follow(target_user)
2014-12-28 21:40:33 +01:00
active_relationships.create(target: target_user)
end
2014-11-30 15:39:13 +01:00
# unfollows an user
def unfollow(target_user)
2014-12-28 21:40:33 +01:00
active_relationships.find_by(target: target_user).destroy
end
2014-11-30 20:31:22 +01:00
# @return [Boolean] true if +self+ is following +target_user+
def following?(target_user)
friends.include? target_user
end
2014-11-30 19:43:22 +01:00
2015-01-14 07:07:40 +01:00
# @param group [Group]
# @return [Boolean] true if +self+ is a member of +group+
def member_of?(group)
group_memberships.pluck(:group_id).include? group.id
end
# answers a question
# @param question [Question] the question to answer
# @param content [String] the answer content
def answer(question, content)
Answer.create!(content: content,
user: self,
question: question)
end
2015-01-03 18:40:56 +01:00
# has the user answered +question+ yet?
# @param question [Question]
def answered?(question)
2015-01-14 07:50:27 +01:00
question.answers.pluck(:user_id).include? self.id
2015-01-03 18:40:56 +01:00
end
2014-11-30 19:43:22 +01:00
# smiles an answer
# @param answer [Answer] the answer to smile
def smile(answer)
2014-12-28 23:26:16 +01:00
Smile.create!(user: self, answer: answer)
2014-11-30 19:43:22 +01:00
end
# unsmile an answer
# @param answer [Answer] the answer to unsmile
def unsmile(answer)
Smile.find_by(user: self, answer: answer).destroy
2014-11-30 19:43:22 +01:00
end
2014-11-30 20:31:22 +01:00
def smiled?(answer)
2015-01-14 07:50:27 +01:00
answer.smiles.pluck(:user_id).include? self.id
2014-11-30 20:31:22 +01:00
end
def display_website
2015-01-05 10:16:00 +01:00
website.match(/https?:\/\/([A-Za-z.\-0-9]+)\/?(?:.*)/i)[1]
rescue NoMethodError
website
end
2014-12-05 14:11:08 +01:00
def comment(answer, content)
2014-12-28 21:58:11 +01:00
Comment.create!(user: self, answer: answer, content: content)
2014-12-05 14:11:08 +01:00
end
2014-12-28 19:32:08 +01:00
# @return [Boolean] is the user a moderator?
def mod?
self.moderator? || self.admin?
end
# region stuff used for reporting/moderation
2015-04-22 04:59:10 +02:00
def report(object, reason = nil)
existing = Report.find_by(target_id: object.id, user_id: self.id, deleted: false)
if existing.nil?
Report.create(type: "Reports::#{object.class}", target_id: object.id, user_id: self.id, reason: reason)
elsif not reason.nil? and reason.length > 0
if existing.reason.nil?
existing.update(reason: reason)
else
existing.update(reason: [existing.reason || "", reason].join("\n"))
end
else
existing
end
2014-12-28 19:32:08 +01:00
end
2014-12-28 23:26:16 +01:00
# @param upvote [Boolean]
def report_vote(report, upvote = false)
return unless mod?
ModerationVote.create!(user: self, report: report, upvote: upvote)
end
def report_unvote(report)
return unless mod?
ModerationVote.find_by(user: self, report: report).destroy
end
def report_voted?(report)
return false unless mod?
report.moderation_votes.each { |s| return true if s.user_id == self.id }
false
end
# @param upvote [Boolean]
def report_x_voted?(report, upvote)
return false unless mod?
report.moderation_votes.where(upvote: upvote).each { |s| return true if s.user_id == self.id }
false
end
2014-12-29 00:50:14 +01:00
def report_comment(report, content)
ModerationComment.create!(user: self, report: report, content: content)
end
# endregion
2014-12-29 14:51:52 +01:00
def cropping?
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end
2014-08-01 12:07:16 +02:00
end