message_train 0.6.17 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +16 -13
- data/.rubocop_todo.yml +12 -0
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/Gemfile +28 -30
- data/README.md +284 -0
- data/Rakefile +6 -7
- data/VERSION +1 -1
- data/app/assets/javascripts/ckeditor/{config.js.coffee → config.js} +7 -6
- data/app/assets/stylesheets/message_train.scss +0 -8
- data/app/controllers/concerns/message_train_authorization.rb +37 -0
- data/app/controllers/concerns/message_train_support.rb +41 -69
- data/app/controllers/message_train/application_controller.rb +1 -0
- data/app/controllers/message_train/boxes_controller.rb +5 -4
- data/app/controllers/message_train/conversations_controller.rb +7 -5
- data/app/controllers/message_train/messages_controller.rb +43 -27
- data/app/controllers/message_train/participants_controller.rb +14 -25
- data/app/controllers/message_train/unsubscribes_controller.rb +96 -61
- data/app/helpers/message_train/application_helper.rb +13 -7
- data/app/helpers/message_train/attachments_helper.rb +4 -12
- data/app/helpers/message_train/boxes_helper.rb +4 -14
- data/app/helpers/message_train/collectives_helper.rb +23 -29
- data/app/helpers/message_train/conversations_helper.rb +52 -30
- data/app/helpers/message_train/messages_helper.rb +33 -20
- data/app/mailers/message_train/receipt_mailer.rb +22 -12
- data/app/models/message_train/attachment.rb +2 -2
- data/app/models/message_train/box.rb +182 -228
- data/app/models/message_train/conversation.rb +100 -103
- data/app/models/message_train/ignore.rb +83 -4
- data/app/models/message_train/message.rb +66 -117
- data/app/models/message_train/receipt.rb +73 -49
- data/app/views/message_train/boxes/show.html.haml +11 -7
- data/config/locales/en.yml +1 -0
- data/config/routes.rb +6 -12
- data/lib/message_train.rb +3 -1
- data/lib/message_train/class_methods.rb +51 -0
- data/lib/message_train/configuration.rb +28 -3
- data/lib/message_train/instance_methods.rb +209 -0
- data/lib/message_train/mixin.rb +25 -320
- data/message_train.gemspec +83 -83
- data/spec/controllers/message_train/boxes_controller_spec.rb +37 -19
- data/spec/controllers/message_train/concerns_spec.rb +21 -3
- data/spec/controllers/message_train/conversations_controller_spec.rb +41 -18
- data/spec/controllers/message_train/messages_controller_spec.rb +112 -31
- data/spec/controllers/message_train/participants_controller_spec.rb +33 -7
- data/spec/controllers/message_train/unsubscribes_controller_spec.rb +10 -8
- data/spec/dummy/app/assets/stylesheets/{application.css.scss → application.scss} +2 -1
- data/spec/dummy/app/assets/stylesheets/bootstrap-everything.scss +54 -0
- data/spec/dummy/app/models/group.rb +1 -1
- data/spec/dummy/app/views/layouts/application.html.haml +9 -8
- data/spec/dummy/bin/setup +8 -8
- data/spec/dummy/config/application.rb +0 -3
- data/spec/dummy/config/environments/test.rb +4 -2
- data/spec/dummy/db/schema.rb +94 -103
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/factories/attachment.rb +3 -1
- data/spec/factories/message.rb +2 -3
- data/spec/features/boxes_spec.rb +0 -3
- data/spec/helpers/message_train/application_helper_spec.rb +3 -2
- data/spec/helpers/message_train/attachment_helper_spec.rb +4 -0
- data/spec/helpers/message_train/boxes_helper_spec.rb +1 -0
- data/spec/helpers/message_train/collectives_helper_spec.rb +1 -0
- data/spec/helpers/message_train/conversations_helper_spec.rb +3 -2
- data/spec/helpers/message_train/messages_helper_spec.rb +2 -1
- data/spec/models/group_spec.rb +6 -4
- data/spec/models/message_train/box_spec.rb +0 -88
- data/spec/models/message_train/ignore_spec.rb +65 -0
- data/spec/models/message_train/message_spec.rb +6 -5
- data/spec/models/message_train/receipt_spec.rb +6 -8
- data/spec/models/role_spec.rb +2 -2
- data/spec/models/user_spec.rb +29 -101
- data/spec/rails_helper.rb +16 -30
- data/spec/support/feature_behaviors.rb +2 -1
- data/spec/support/shared_connection.rb +5 -0
- data/spec/support/utilities.rb +7 -8
- metadata +145 -120
- data/README.rdoc +0 -175
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
@@ -3,20 +3,9 @@ module MessageTrain
|
|
3
3
|
module MessagesHelper
|
4
4
|
def message_class(box, message)
|
5
5
|
css_classes = []
|
6
|
-
|
7
|
-
css_classes <<
|
8
|
-
|
9
|
-
else
|
10
|
-
'read'
|
11
|
-
end
|
12
|
-
|
13
|
-
message.draft && css_classes << 'draft'
|
14
|
-
|
15
|
-
if box.division == :trash
|
16
|
-
!message.is_trashed_for?(@box_user) && css_classes << 'hide'
|
17
|
-
else
|
18
|
-
!message.is_untrashed_for?(@box_user) && css_classes << 'hide'
|
19
|
-
end
|
6
|
+
css_classes << message_css_for_read_state(message)
|
7
|
+
css_classes << message_css_for_draft_state(message)
|
8
|
+
css_classes << message_css_for_hide_state(box, message)
|
20
9
|
css_classes.join(' ')
|
21
10
|
end
|
22
11
|
|
@@ -48,20 +37,44 @@ module MessageTrain
|
|
48
37
|
private
|
49
38
|
|
50
39
|
def message_toggle(message, icon, mark_to_set, title, options = {})
|
51
|
-
options[:remote] = true
|
52
|
-
options[:id] = "mark_#{mark_to_set}_#{message.id}"
|
53
|
-
options[:class] = 'mark-link'
|
54
|
-
options[:method] = :put
|
55
|
-
options[:title] = title
|
56
40
|
render(
|
57
41
|
partial: 'message_train/messages/toggle',
|
58
42
|
locals: {
|
59
43
|
message: message,
|
60
44
|
icon: icon,
|
61
45
|
mark_to_set: mark_to_set,
|
62
|
-
options: options
|
46
|
+
options: message_toggle_options(message, mark_to_set, title, options)
|
63
47
|
}
|
64
48
|
)
|
65
49
|
end
|
50
|
+
|
51
|
+
def message_toggle_options(message, mark_to_set, title, options = {})
|
52
|
+
options[:remote] = true
|
53
|
+
options[:id] = "mark_#{mark_to_set}_#{message.id}"
|
54
|
+
options[:class] = 'mark-link'
|
55
|
+
options[:method] = :put
|
56
|
+
options[:title] = title
|
57
|
+
options
|
58
|
+
end
|
59
|
+
|
60
|
+
def message_css_for_hide_state(box, message)
|
61
|
+
if box.division == :trash
|
62
|
+
'hide' unless message.is_trashed_for?(@box_user)
|
63
|
+
else
|
64
|
+
'hide' unless message.is_untrashed_for?(@box_user)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def message_css_for_draft_state(message)
|
69
|
+
'draft' if message.draft
|
70
|
+
end
|
71
|
+
|
72
|
+
def message_css_for_read_state(message)
|
73
|
+
if message.is_unread_for?(@box_user)
|
74
|
+
'unread panel-info'
|
75
|
+
else
|
76
|
+
'read'
|
77
|
+
end
|
78
|
+
end
|
66
79
|
end
|
67
80
|
end
|
@@ -6,22 +6,32 @@ module MessageTrain
|
|
6
6
|
@recipient = receipt.recipient
|
7
7
|
@through = receipt.received_through
|
8
8
|
if @recipient == @through
|
9
|
-
|
10
|
-
site_name: MessageTrain.configuration.site_name
|
11
|
-
)
|
9
|
+
set_self_heading
|
12
10
|
else
|
13
|
-
|
14
|
-
MessageTrain.configuration.name_columns[
|
15
|
-
@through.class.table_name.to_sym
|
16
|
-
]
|
17
|
-
)
|
18
|
-
@heading = :new_message_through_on_site_name.l(
|
19
|
-
site_name: MessageTrain.configuration.site_name,
|
20
|
-
through: @through_name
|
21
|
-
)
|
11
|
+
set_through_heading
|
22
12
|
end
|
23
13
|
@subject = "#{@heading}: #{@receipt.message.subject}"
|
24
14
|
mail(to: @recipient.email, subject: @subject)
|
25
15
|
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def set_self_heading
|
20
|
+
@heading = :new_message_on_site_name.l(
|
21
|
+
site_name: MessageTrain.configuration.site_name
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_through_heading
|
26
|
+
@through_name = @through.send(
|
27
|
+
MessageTrain.configuration.name_columns[
|
28
|
+
@through.class.table_name.to_sym
|
29
|
+
]
|
30
|
+
)
|
31
|
+
@heading = :new_message_through_on_site_name.l(
|
32
|
+
site_name: MessageTrain.configuration.site_name,
|
33
|
+
through: @through_name
|
34
|
+
)
|
35
|
+
end
|
26
36
|
end
|
27
37
|
end
|
@@ -39,9 +39,9 @@ module MessageTrain
|
|
39
39
|
]
|
40
40
|
)
|
41
41
|
def image?
|
42
|
-
# rubocop:disable
|
42
|
+
# rubocop:disable Metrics/LineLength
|
43
43
|
!(attachment_content_type =~ %r{^(image|(x-)?application)/(bmp|gif|jpeg|jpg|pjpeg|png|x-png)$}).nil?
|
44
|
-
# rubocop:enable
|
44
|
+
# rubocop:enable Metrics/LineLength
|
45
45
|
end
|
46
46
|
|
47
47
|
Paperclip.interpolates :style_prefix do |attachment, style|
|
@@ -1,6 +1,19 @@
|
|
1
1
|
module MessageTrain
|
2
2
|
# Box model
|
3
3
|
class Box
|
4
|
+
MARK_METHODS = {
|
5
|
+
'Hash' => :mark_hash,
|
6
|
+
'Array' => :mark_array,
|
7
|
+
'String' => :mark_id,
|
8
|
+
'Fixnum' => :mark_id,
|
9
|
+
'MessageTrain::Conversation' => :mark_communication
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
AUTHORIZE_METHODS = {
|
13
|
+
'MessageTrain::Conversation' => :authorize_conversation,
|
14
|
+
'MessageTrain::Message' => :authorize_message
|
15
|
+
}.freeze
|
16
|
+
|
4
17
|
include ActiveModel::Model
|
5
18
|
attr_accessor :parent, :division, :participant, :errors, :results
|
6
19
|
alias id division
|
@@ -18,8 +31,7 @@ module MessageTrain
|
|
18
31
|
end
|
19
32
|
|
20
33
|
def unread_count
|
21
|
-
|
22
|
-
found.count
|
34
|
+
conversations(read: false).count
|
23
35
|
end
|
24
36
|
|
25
37
|
def conversations(options = {})
|
@@ -28,21 +40,6 @@ module MessageTrain
|
|
28
40
|
if options[:read] == false || options[:unread]
|
29
41
|
found = found.with_unread_for(participant)
|
30
42
|
end
|
31
|
-
if division == :trash
|
32
|
-
found = found.with_trashed_for(participant)
|
33
|
-
else
|
34
|
-
found = found.with_untrashed_for(participant)
|
35
|
-
found = if division == :drafts
|
36
|
-
found.with_drafts_by(participant)
|
37
|
-
else
|
38
|
-
found.with_ready_for(participant)
|
39
|
-
end
|
40
|
-
found = if division == :ignored
|
41
|
-
found.ignored(participant)
|
42
|
-
else
|
43
|
-
found.unignored(participant)
|
44
|
-
end
|
45
|
-
end
|
46
43
|
found
|
47
44
|
end
|
48
45
|
|
@@ -54,131 +51,76 @@ module MessageTrain
|
|
54
51
|
parent.all_messages(participant).find(id)
|
55
52
|
end
|
56
53
|
|
57
|
-
def
|
58
|
-
|
59
|
-
|
54
|
+
def send_message(attributes)
|
55
|
+
message = MessageTrain::Message.new attributes
|
56
|
+
return false unless authorize_send_message(message)
|
57
|
+
message.sender = participant
|
58
|
+
return message_send_error(message) unless message.save
|
59
|
+
message_send_success(message)
|
60
|
+
end
|
61
|
+
|
62
|
+
def message_send_error(message)
|
63
|
+
errors.add(message, message.errors.full_messages.to_sentence)
|
64
|
+
message
|
65
|
+
end
|
66
|
+
|
67
|
+
def message_send_success(message)
|
68
|
+
if message.draft
|
69
|
+
results.add(message, :message_saved_as_draft.l)
|
60
70
|
else
|
61
|
-
|
62
|
-
previous_message = conversation.messages.last
|
63
|
-
message = conversation.messages.build(args)
|
64
|
-
message.subject = "Re: #{conversation.subject}"
|
65
|
-
message.body = "<blockquote>#{previous_message.body}</blockquote>"\
|
66
|
-
'<p> </p>'
|
67
|
-
recipient_arrays = {}
|
68
|
-
conversation.default_recipients_for(parent).each do |recipient|
|
69
|
-
table_name = recipient.class.table_name
|
70
|
-
recipient_arrays[table_name] ||= []
|
71
|
-
recipient_arrays[table_name] << recipient.send(
|
72
|
-
MessageTrain.configuration.slug_columns[table_name.to_sym]
|
73
|
-
)
|
74
|
-
end
|
75
|
-
recipient_arrays.each do |key, array|
|
76
|
-
message.recipients_to_save[key] = array.join(', ')
|
77
|
-
end
|
71
|
+
results.add(message, :message_sent.l)
|
78
72
|
end
|
79
73
|
message
|
80
74
|
end
|
81
75
|
|
82
|
-
def
|
83
|
-
message_to_send = MessageTrain::Message.new attributes
|
84
|
-
message_to_send.sender = participant
|
76
|
+
def authorize_send_message(message)
|
85
77
|
unless parent.valid_senders.include? participant
|
86
78
|
errors.add(
|
87
|
-
|
79
|
+
message,
|
88
80
|
:invalid_sender_for_thing.l(
|
89
81
|
thing: "#{parent.class.name} #{parent.id}"
|
90
82
|
)
|
91
83
|
)
|
92
84
|
return false
|
93
85
|
end
|
94
|
-
|
95
|
-
if message_to_send.draft
|
96
|
-
results.add(message_to_send, :message_saved_as_draft.l)
|
97
|
-
else
|
98
|
-
results.add(message_to_send, :message_sent.l)
|
99
|
-
end
|
100
|
-
else
|
101
|
-
errors.add(
|
102
|
-
message_to_send,
|
103
|
-
message_to_send.errors.full_messages.to_sentence
|
104
|
-
)
|
105
|
-
end
|
106
|
-
message_to_send
|
86
|
+
true
|
107
87
|
end
|
108
88
|
|
109
89
|
def update_message(message, attributes)
|
90
|
+
!message.draft && raise(ActiveRecord::RecordNotFound)
|
110
91
|
attributes.delete(:sender)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
if message.errors.empty?
|
117
|
-
if message.draft
|
118
|
-
results.add(message, :message_saved_as_draft.l)
|
119
|
-
else
|
120
|
-
results.add(message, :message_sent.l)
|
121
|
-
end
|
122
|
-
else
|
123
|
-
errors.add(
|
124
|
-
message,
|
125
|
-
message.errors.full_messages.to_sentence
|
126
|
-
)
|
127
|
-
end
|
128
|
-
message
|
129
|
-
else
|
130
|
-
errors.add(
|
131
|
-
message,
|
132
|
-
:access_to_message_id_denied.l(id: message.id)
|
133
|
-
)
|
134
|
-
false
|
135
|
-
end
|
92
|
+
return false unless authorize_update_message(message)
|
93
|
+
message.update(attributes)
|
94
|
+
message.reload
|
95
|
+
return message_update_error(message) if message.errors.any?
|
96
|
+
message_update_success(message)
|
136
97
|
end
|
137
98
|
|
138
|
-
def
|
139
|
-
|
140
|
-
|
141
|
-
ignore object.values
|
142
|
-
when 'Array'
|
143
|
-
object.collect { |item| ignore(item) }.uniq == [true]
|
144
|
-
when 'String', 'Fixnum'
|
145
|
-
ignore(find_conversation(object.to_i))
|
146
|
-
when 'MessageTrain::Conversation'
|
147
|
-
if authorize(object)
|
148
|
-
object.participant_ignore(participant)
|
149
|
-
# We can assume the previous line has succeeded at this point,
|
150
|
-
# because participant_ignore raises an ActiveRecord error otherwise.
|
151
|
-
# Therefore we simply report success, since we got here.
|
152
|
-
results.add(object, :update_successful.l)
|
153
|
-
else
|
154
|
-
false
|
155
|
-
end
|
99
|
+
def message_update_success(message)
|
100
|
+
if message.draft
|
101
|
+
results.add(message, :message_saved_as_draft.l)
|
156
102
|
else
|
157
|
-
|
103
|
+
results.add(message, :message_sent.l)
|
158
104
|
end
|
105
|
+
message
|
159
106
|
end
|
160
107
|
|
161
|
-
def
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
if authorize(object)
|
171
|
-
object.participant_unignore(participant)
|
172
|
-
# We can assume the previous line has succeeded at this point,
|
173
|
-
# because participant_unignore raises an ActiveRecord error
|
174
|
-
# otherwise. Therefore we simply report success, since we got here.
|
175
|
-
results.add(object, :update_successful.l)
|
176
|
-
else
|
177
|
-
false
|
178
|
-
end
|
179
|
-
else
|
180
|
-
errors.add(self, :cannot_unignore_type.l(type: object.class.name))
|
108
|
+
def message_update_error(message)
|
109
|
+
errors.add(message, message.errors.full_messages.to_sentence)
|
110
|
+
message
|
111
|
+
end
|
112
|
+
|
113
|
+
def authorize_update_message(message)
|
114
|
+
unless message.sender == participant &&
|
115
|
+
parent.valid_senders.include?(participant)
|
116
|
+
return message_access_denied(message)
|
181
117
|
end
|
118
|
+
true
|
119
|
+
end
|
120
|
+
|
121
|
+
def message_access_denied(message)
|
122
|
+
errors.add(message, :access_to_message_id_denied.l(id: message.id))
|
123
|
+
false
|
182
124
|
end
|
183
125
|
|
184
126
|
def title
|
@@ -186,74 +128,73 @@ module MessageTrain
|
|
186
128
|
end
|
187
129
|
|
188
130
|
def message
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
:nothing_to_do.l
|
193
|
-
else
|
194
|
-
results.all.collect { |x| x[:message] }.uniq.to_sentence
|
195
|
-
end
|
131
|
+
what_happened = errors.any? ? errors : results
|
132
|
+
return :nothing_to_do.l unless what_happened.any?
|
133
|
+
what_happened.all.map { |x| x[:message] }.uniq.to_sentence
|
196
134
|
end
|
197
135
|
|
198
136
|
def mark(mark_to_set, objects)
|
199
137
|
objects.each do |key, object|
|
200
|
-
|
201
|
-
|
202
|
-
elsif key.to_s =~ /^(conversations|messages)$/
|
203
|
-
data_type = object.class.name
|
204
|
-
case data_type
|
205
|
-
when 'Hash'
|
206
|
-
mark(mark_to_set, key => object.values)
|
207
|
-
when 'Array'
|
208
|
-
object.collect do |item|
|
209
|
-
mark(mark_to_set, key => item)
|
210
|
-
end.uniq == [true]
|
211
|
-
when 'String', 'Fixnum'
|
212
|
-
model_name = "MessageTrain::#{key.to_s.classify}"
|
213
|
-
model = model_name.constantize
|
214
|
-
mark(mark_to_set, key => model.find_by_id!(object.to_i))
|
215
|
-
when 'MessageTrain::Conversation', 'MessageTrain::Message'
|
216
|
-
if authorize(object)
|
217
|
-
object.mark(mark_to_set, participant)
|
218
|
-
# We can assume the previous line has succeeded at this point,
|
219
|
-
# because mark raises an ActiveRecord error otherwise.
|
220
|
-
# Therefore we simply report success, since we got here.
|
221
|
-
results.add(object, :update_successful.l)
|
222
|
-
else
|
223
|
-
false
|
224
|
-
end
|
225
|
-
else
|
226
|
-
errors.add(
|
227
|
-
self,
|
228
|
-
:cannot_mark_with_data_type.l(data_type: data_type)
|
229
|
-
)
|
230
|
-
end
|
231
|
-
else
|
138
|
+
next unless object.present? # Allow skipping empty objects
|
139
|
+
unless key.to_s =~ /^(conversations|messages)$/
|
232
140
|
errors.add(self, :cannot_mark_type.l(type: key.to_s))
|
141
|
+
next
|
233
142
|
end
|
143
|
+
mark_object mark_to_set, key, object
|
234
144
|
end
|
235
145
|
end
|
236
146
|
|
147
|
+
def mark_hash(mark_to_set, key, object)
|
148
|
+
mark(mark_to_set, key => object.values)
|
149
|
+
end
|
150
|
+
|
151
|
+
def mark_array(mark_to_set, key, object)
|
152
|
+
object.collect { |item| mark(mark_to_set, key => item) }
|
153
|
+
.uniq == [true]
|
154
|
+
end
|
155
|
+
|
156
|
+
def mark_id(mark_to_set, key, object)
|
157
|
+
model = "MessageTrain::#{key.to_s.classify}".constantize
|
158
|
+
mark_communication(mark_to_set, key, model.find_by_id!(object.to_i))
|
159
|
+
end
|
160
|
+
|
161
|
+
def mark_communication(mark_to_set, _key, object)
|
162
|
+
return unless authorize(object)
|
163
|
+
object.mark(mark_to_set, participant)
|
164
|
+
results.add(object, :update_successful.l)
|
165
|
+
end
|
166
|
+
|
167
|
+
def marking_error(object)
|
168
|
+
errors.add(
|
169
|
+
self, :cannot_mark_with_data_type.l(data_type: object.class.name)
|
170
|
+
)
|
171
|
+
object
|
172
|
+
end
|
173
|
+
|
174
|
+
def mark_object(mark_to_set, key, object)
|
175
|
+
method = MARK_METHODS[object.class.name]
|
176
|
+
return marking_error(object) if method.nil?
|
177
|
+
send(method, mark_to_set, key, object)
|
178
|
+
end
|
179
|
+
|
237
180
|
def authorize(object)
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
errors.add(object, :cannot_authorize_type.l(type: object.class.name))
|
256
|
-
end
|
181
|
+
method = AUTHORIZE_METHODS[object.class.name]
|
182
|
+
return authorize_error(object) if method.nil?
|
183
|
+
send(method, object)
|
184
|
+
end
|
185
|
+
|
186
|
+
def authorize_error(object)
|
187
|
+
errors.add(object, :cannot_authorize_type.l(type: object.class.name))
|
188
|
+
end
|
189
|
+
|
190
|
+
def authorize_conversation(object)
|
191
|
+
object.includes_receipts_for?(participant) ||
|
192
|
+
errors.add(object, :access_to_conversation_id_denied.l(id: object.id))
|
193
|
+
end
|
194
|
+
|
195
|
+
def authorize_message(object)
|
196
|
+
object.receipts.for(participant).any? ||
|
197
|
+
errors.add(object, :access_to_message_id_denied.l(id: object.id))
|
257
198
|
end
|
258
199
|
|
259
200
|
# Box::Results class
|
@@ -266,64 +207,77 @@ module MessageTrain
|
|
266
207
|
end
|
267
208
|
|
268
209
|
def add(object, message)
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
}
|
278
|
-
if box.parent != box.participant
|
279
|
-
collective = box.parent
|
280
|
-
table_part = collective.class.table_name
|
281
|
-
slug_part = collective.send(
|
282
|
-
MessageTrain.configuration.slug_columns[
|
283
|
-
collective.class.table_name.to_sym
|
284
|
-
]
|
285
|
-
)
|
286
|
-
route_args[:collective_id] = "#{table_part}:#{slug_part}"
|
287
|
-
end
|
288
|
-
item[:path] = MessageTrain::Engine.routes.path_for(route_args)
|
289
|
-
when 'MessageTrain::Conversation', 'MessageTrain::Message'
|
290
|
-
if object.new_record?
|
291
|
-
item[:css_id] = "#{object.class.table_name.singularize}"
|
292
|
-
item[:path] = nil
|
293
|
-
else
|
294
|
-
item[:css_id] = "#{object.class.table_name.singularize}_"\
|
295
|
-
"#{object.id.to_s}"
|
296
|
-
route_args = {
|
297
|
-
controller: object.class.table_name
|
298
|
-
.gsub('message_train_', 'message_train/'),
|
299
|
-
action: :show,
|
300
|
-
box_division: box.division,
|
301
|
-
id: object.id
|
302
|
-
}
|
303
|
-
if box.parent != box.participant
|
304
|
-
collective = box.parent
|
305
|
-
table_part = collective.class.table_name
|
306
|
-
slug_part = collective.send(
|
307
|
-
MessageTrain.configuration.slug_columns[
|
308
|
-
collective.class.table_name.to_sym
|
309
|
-
]
|
310
|
-
)
|
311
|
-
route_args[:collective_id] = "#{table_part}:#{slug_part}"
|
312
|
-
end
|
313
|
-
item[:path] = MessageTrain::Engine.routes.path_for(route_args)
|
314
|
-
end
|
315
|
-
else
|
316
|
-
item[:css_id] = object.class.name.singularize.downcase
|
317
|
-
item[:path] = nil
|
318
|
-
end
|
319
|
-
item[:message] = message
|
320
|
-
items << item
|
210
|
+
items << case object.class.name
|
211
|
+
when 'MessageTrain::Box'
|
212
|
+
result_for_box(object, message)
|
213
|
+
when 'MessageTrain::Conversation', 'MessageTrain::Message'
|
214
|
+
result_for_communication(object, message)
|
215
|
+
else
|
216
|
+
result_for_misc_object(object, message)
|
217
|
+
end
|
321
218
|
true
|
322
219
|
end
|
323
220
|
|
221
|
+
def result_for_misc_object(object, message)
|
222
|
+
css_id = object.class.name.singularize.downcase
|
223
|
+
{ css_id: css_id, path: nil, message: message }
|
224
|
+
end
|
225
|
+
|
226
|
+
def result_for_communication(object, message)
|
227
|
+
return result_for_new(object, message) if object.new_record?
|
228
|
+
path = MessageTrain::Engine.routes.path_for(object_route_args(object))
|
229
|
+
css_id = "#{object.class.table_name.singularize}_#{object.id}"
|
230
|
+
{ message: message, css_id: css_id, path: path }
|
231
|
+
end
|
232
|
+
|
233
|
+
def object_route_args(object)
|
234
|
+
table_name = object.class.table_name
|
235
|
+
{
|
236
|
+
controller: table_name.gsub('message_train_', 'message_train/'),
|
237
|
+
action: :show,
|
238
|
+
box_division: box.division,
|
239
|
+
id: object.id,
|
240
|
+
collective_id: collective_id_for_box(box)
|
241
|
+
}
|
242
|
+
end
|
243
|
+
|
244
|
+
def result_for_new(object, message)
|
245
|
+
{
|
246
|
+
message: message,
|
247
|
+
css_id: object.class.table_name.singularize,
|
248
|
+
path: nil
|
249
|
+
}
|
250
|
+
end
|
251
|
+
|
252
|
+
def result_for_box(object, message)
|
253
|
+
path = MessageTrain::Engine.routes.path_for(box_route_args(object))
|
254
|
+
{ css_id: 'box', message: message, path: path }
|
255
|
+
end
|
256
|
+
|
257
|
+
def box_route_args(object)
|
258
|
+
{
|
259
|
+
controller: 'message_train/boxes',
|
260
|
+
action: :show,
|
261
|
+
division: object.division,
|
262
|
+
collective_id: collective_id_for_box(box)
|
263
|
+
}
|
264
|
+
end
|
265
|
+
|
266
|
+
def collective_id_for_box(box)
|
267
|
+
return if box.parent == box.participant
|
268
|
+
collective = box.parent
|
269
|
+
table_part = collective.class.table_name
|
270
|
+
slug_part = collective.message_train_slug
|
271
|
+
"#{table_part}:#{slug_part}"
|
272
|
+
end
|
273
|
+
|
324
274
|
def all
|
325
275
|
items
|
326
276
|
end
|
277
|
+
|
278
|
+
def any?
|
279
|
+
items.any?
|
280
|
+
end
|
327
281
|
end
|
328
282
|
# Box::Errors class
|
329
283
|
class Errors < Results
|