-
-
Notifications
You must be signed in to change notification settings - Fork 686
/
poll.rb
82 lines (71 loc) · 2.5 KB
/
poll.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
module Ability::Poll
def initialize(user)
super(user)
can :vote_in, ::Poll do |poll|
user.is_logged_in? &&
poll.active? &&
(
poll.unmasked_voters.exists?(user.id) ||
(!poll.specified_voters_only && poll.members.exists?(user.id))
)
end
can [:export], ::Poll do |poll|
user.can?(:show, poll) && poll.show_results?
end
can [:show], ::Poll do |poll|
PollQuery.visible_to(user: user, show_public: true).exists?(poll.id)
end
can [:create], ::Poll do |poll|
(poll.poll_template_id.nil? || poll.poll_template.public? || user.group_ids.include?(poll.poll_template.group_id)) &&
(poll.discussion_id.nil? || !poll.discussion.closed_at) &&
(
(poll.group_id &&
(
(poll.group.admins.exists?(user.id) || # user is admin
(poll.group.members_can_raise_motions && poll.group.members.exists?(user.id)) || # user is member
(poll.group.members_can_raise_motions && poll.discussion.present? && poll.discussion.guests.exists?(user.id)))
)
) ||
(poll.group_id.nil? && poll.discussion_id && poll.discussion.members.exists?(user.id)) ||
(poll.group_id.nil? && poll.discussion_id.nil? && user.is_logged_in? && user.email_verified?)
)
end
can [:announce, :remind], ::Poll do |poll|
if poll.group_id
poll.group.admins.exists?(user.id) ||
(poll.group.members_can_announce && poll.admins.exists?(user.id))
else
poll.admins.exists?(user.id) ||
(!poll.specified_voters_only && poll.members.exists?(user.id))
end
end
can [:add_voters, :add_members], ::Poll do |poll|
poll.admins.exists?(user.id)
end
can [:add_guests], ::Poll do |poll|
if poll.group_id
Subscription.for(poll.group).allow_guests &&
(poll.group.admins.exists?(user.id) || (poll.group.members_can_add_guests && poll.admins.exists?(user.id)))
else
poll.admins.exists?(user.id)
end
end
can [:update], ::Poll do |poll|
(poll.discussion_id.blank? || !poll.discussion.closed_at) &&
poll.admins.exists?(user.id)
end
can [:destroy], ::Poll do |poll|
(poll.discussion_id.blank? || !poll.discussion.closed_at) &&
poll.admins.exists?(user.id)
end
can :close, ::Poll do |poll|
poll.active? &&
poll.admins.exists?(user.id)
end
can :reopen, ::Poll do |poll|
poll.closed? &&
!poll.anonymous &&
can?(:update, poll)
end
end
end