forked from patcito/shapado
-
Notifications
You must be signed in to change notification settings - Fork 115
/
close_request.rb
87 lines (67 loc) · 2.44 KB
/
close_request.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
class CloseRequest
include Mongoid::Document
include Shapado::Models::Trackable
track_activities :user, :reason, :comment, :_parent, :scope => [:group_id], :target => :_parent do |activity, question|
follower_ids = question.follower_ids+question.contributor_ids
follower_ids.delete(activity.user_id)
activity.add_followers(*follower_ids)
end
REASONS = %w{dupe ot no_question not_relevant spam}
identity :type => String
field :reason, :type => String
field :comment, :type => String
referenced_in :user
embedded_in :closeable, polymorphic: true
validates_presence_of :user
validates_presence_of :closeable
validates_inclusion_of :reason, :in => REASONS
validate :should_be_unique
validate :check_reputation
def increment_counter
self.closeable.increment(:close_requests_count => 1)
end
def decrement_counter
self._parent.decrement(:close_requests_count => 1)
end
def self.humanize_action(action)
case action
when "create"
"requested_to_close"
end
end
def group
self._parent.group
end
protected
def should_be_unique
valid = true
request = self._parent.close_requests.detect{ |rq| rq.user_id == self.user_id }
valid = (request.nil? || request.id == self.id)
unless valid
self.errors.add(:user, I18n.t("close_requests.model.messages.already_requested"))
end
valid
end
def check_reputation
parent = self._parent
if parent.can_be_requested_to_close_by?(self.user)
return true
end
if ((parent.user_id == self.user_id) &&
!self.user.can_vote_to_close_own_question_on?(parent.group))
reputation = parent.group.reputation_constrains["vote_to_close_own_question"]
self.errors.add(:reputation, I18n.t("users.messages.errors.reputation_needed",
:min_reputation => reputation,
:action => I18n.t("users.actions.vote_to_close_own_question")))
return false
end
unless self.user.can_vote_to_close_any_question_on?(parent.group)
reputation = parent.group.reputation_constrains["vote_to_close_any_question"]
self.errors.add(:reputation, I18n.t("users.messages.errors.reputation_needed",
:min_reputation => reputation,
:action => I18n.t("users.actions.vote_to_close_any_question")))
return false
end
true
end
end