message_train 0.1.7 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.simplecov +8 -0
- data/.travis.yml +7 -2
- data/Gemfile +3 -0
- data/README.rdoc +37 -1
- data/Rakefile +5 -6
- data/VERSION +1 -1
- data/app/assets/javascripts/message_train.js +33 -0
- data/app/assets/stylesheets/message_train.scss +26 -0
- data/app/controllers/concerns/message_train_support.rb +127 -0
- data/app/controllers/message_train/application_controller.rb +1 -60
- data/app/controllers/message_train/boxes_controller.rb +0 -4
- data/app/controllers/message_train/messages_controller.rb +12 -6
- data/app/controllers/message_train/participants_controller.rb +1 -1
- data/app/controllers/message_train/unsubscribes_controller.rb +59 -0
- data/app/helpers/message_train/application_helper.rb +26 -0
- data/app/helpers/message_train/attachments_helper.rb +19 -0
- data/app/helpers/message_train/boxes_helper.rb +16 -11
- data/app/helpers/message_train/collectives_helper.rb +48 -0
- data/app/helpers/message_train/conversations_helper.rb +24 -16
- data/app/helpers/message_train/messages_helper.rb +14 -12
- data/app/mailers/message_train/application_mailer.rb +8 -0
- data/app/mailers/message_train/previews/receipt_mailer_preview.rb +10 -0
- data/app/mailers/message_train/receipt_mailer.rb +17 -0
- data/app/models/message_train/attachment.rb +28 -10
- data/app/models/message_train/box.rb +114 -83
- data/app/models/message_train/conversation.rb +48 -39
- data/app/models/message_train/ignore.rb +2 -6
- data/app/models/message_train/message.rb +40 -24
- data/app/models/message_train/receipt.rb +20 -10
- data/app/models/message_train/unsubscribe.rb +7 -0
- data/app/views/layouts/mailer.html.haml +6 -0
- data/app/views/message_train/application/_attachment_fields.html.haml +7 -0
- data/app/views/message_train/application/_attachment_link.html.haml +4 -0
- data/app/views/message_train/application/_widget.html.haml +6 -0
- data/app/views/message_train/boxes/_dropdown_list.html.haml +1 -2
- data/app/views/message_train/boxes/_list_item.html.haml +2 -2
- data/app/views/message_train/boxes/_widget.html.haml +4 -1
- data/app/views/message_train/boxes/show.html.haml +12 -4
- data/app/views/message_train/collectives/_dropdown_list.html.haml +6 -0
- data/app/views/message_train/collectives/_list_item.html.haml +5 -0
- data/app/views/message_train/collectives/_widget.html.haml +7 -0
- data/app/views/message_train/conversations/_conversation.html.haml +22 -7
- data/app/views/message_train/conversations/_deleted_toggle.html.haml +1 -1
- data/app/views/message_train/conversations/_ignored_toggle.html.haml +3 -3
- data/app/views/message_train/conversations/_read_toggle.html.haml +3 -3
- data/app/views/message_train/conversations/_toggle.html.haml +4 -1
- data/app/views/message_train/conversations/_trashed_toggle.html.haml +3 -3
- data/app/views/message_train/conversations/show.html.haml +4 -3
- data/app/views/message_train/messages/_deleted_toggle.html.haml +1 -1
- data/app/views/message_train/messages/_form.html.haml +22 -7
- data/app/views/message_train/messages/_message.html.haml +14 -4
- data/app/views/message_train/messages/_read_toggle.html.haml +1 -1
- data/app/views/message_train/messages/_trashed_toggle.html.haml +1 -1
- data/app/views/message_train/messages/edit.html.haml +1 -1
- data/app/views/message_train/messages/new.html.haml +4 -1
- data/app/views/message_train/participants/_field.html.haml +1 -1
- data/app/views/message_train/participants/_prefilled_field.html.haml +4 -0
- data/app/views/message_train/receipt_mailer/notification_email.html.haml +13 -0
- data/app/views/message_train/unsubscribes/index.html.haml +10 -0
- data/config/environment.rb +1 -0
- data/config/locales/en.yml +49 -7
- data/config/routes.rb +10 -2
- data/db/migrate/20150901183458_add_received_through_to_message_train_receipts.rb +6 -0
- data/db/migrate/20151004184347_add_unique_index_to_receipts.rb +5 -0
- data/db/migrate/20151124000820_create_message_train_unsubscribes.rb +14 -0
- data/lib/generators/message_train/install/install_generator.rb +8 -2
- data/lib/generators/message_train/install/templates/initializer.rb +5 -1
- data/lib/message_train/configuration.rb +11 -1
- data/lib/message_train/engine.rb +1 -0
- data/lib/message_train/mixin.rb +206 -21
- data/message_train.gemspec +66 -13
- data/spec/controllers/message_train/boxes_controller_spec.rb +10 -3
- data/spec/controllers/message_train/concerns_spec.rb +40 -0
- data/spec/controllers/message_train/conversations_controller_spec.rb +3 -3
- data/spec/controllers/message_train/messages_controller_spec.rb +60 -27
- data/spec/controllers/message_train/participants_controller_spec.rb +41 -6
- data/spec/controllers/message_train/unsubscribes_controller_spec.rb +56 -0
- data/spec/dummy/app/assets/files/message_train/attachments/{1917-Boys_Race_Above-Wiki.jpg → image-sample.jpg} +0 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/models/group.rb +16 -1
- data/spec/dummy/app/models/role.rb +22 -0
- data/spec/dummy/app/models/user.rb +1 -1
- data/spec/dummy/app/views/layouts/_top_navigation.html.haml +4 -2
- data/spec/dummy/app/views/layouts/application.html.haml +2 -3
- data/spec/dummy/app/views/pages/index.html.haml +4 -0
- data/spec/dummy/config/application.rb +6 -0
- data/spec/dummy/config/environments/development.rb +1 -0
- data/spec/dummy/config/environments/test.rb +1 -0
- data/spec/dummy/config/initializers/high_voltage.rb +3 -0
- data/spec/dummy/config/initializers/message_train.rb +6 -1
- data/spec/dummy/config/initializers/paperclip.rb +2 -2
- data/spec/dummy/config/routes.rb +2 -2
- data/spec/dummy/config/settings.yml +9 -0
- data/spec/dummy/db/migrate/{20150724142846_create_message_train_conversations.night_train.rb → 20150901183629_create_message_train_conversations.message_train.rb} +0 -0
- data/spec/dummy/db/migrate/{20150724142847_create_message_train_messages.night_train.rb → 20150901183630_create_message_train_messages.message_train.rb} +0 -0
- data/spec/dummy/db/migrate/{20150724142848_create_message_train_attachments.night_train.rb → 20150901183631_create_message_train_attachments.message_train.rb} +0 -0
- data/spec/dummy/db/migrate/{20150724142849_create_message_train_receipts.night_train.rb → 20150901183632_create_message_train_receipts.message_train.rb} +0 -0
- data/spec/dummy/db/migrate/{20150724142850_create_message_train_ignores.night_train.rb → 20150901183633_create_message_train_ignores.message_train.rb} +0 -0
- data/spec/dummy/db/migrate/20150901183634_add_received_through_to_message_train_receipts.message_train.rb +7 -0
- data/spec/dummy/db/migrate/20151004184519_add_unique_index_to_receipts.message_train.rb +6 -0
- data/spec/dummy/db/migrate/20151124001417_create_message_train_unsubscribes.message_train.rb +15 -0
- data/spec/dummy/db/schema.rb +24 -7
- data/spec/dummy/db/seeds/conversations.seeds.rb +92 -3
- data/spec/dummy/db/seeds/groups.seeds.rb +27 -0
- data/spec/dummy/db/seeds/test/attachments.seeds.rb +4 -0
- data/spec/dummy/db/seeds/unsubscribes.seeds.rb +12 -0
- data/spec/dummy/db/seeds/users.seeds.rb +27 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/factories/group.rb +4 -4
- data/spec/factories/message.rb +10 -3
- data/spec/features/boxes_spec.rb +160 -33
- data/spec/features/conversations_spec.rb +11 -4
- data/spec/features/messages_spec.rb +20 -6
- data/spec/features/unsubscribes_spec.rb +38 -0
- data/spec/helpers/message_train/application_helper_spec.rb +60 -0
- data/spec/helpers/message_train/attachment_helper_spec.rb +35 -0
- data/spec/helpers/message_train/boxes_helper_spec.rb +11 -5
- data/spec/helpers/message_train/collectives_helper_spec.rb +76 -0
- data/spec/helpers/message_train/conversations_helper_spec.rb +295 -0
- data/spec/helpers/message_train/messages_helper_spec.rb +217 -0
- data/spec/models/group_spec.rb +112 -2
- data/spec/models/message_train/attachment_spec.rb +44 -1
- data/spec/models/message_train/box_spec.rb +306 -51
- data/spec/models/message_train/conversation_spec.rb +84 -6
- data/spec/models/message_train/ignore_spec.rb +0 -4
- data/spec/models/message_train/message_spec.rb +49 -12
- data/spec/models/message_train/receipt_spec.rb +44 -8
- data/spec/models/message_train/unsubscribe_spec.rb +16 -0
- data/spec/models/role_spec.rb +125 -0
- data/spec/models/user_spec.rb +155 -26
- data/spec/rails_helper.rb +8 -1
- data/spec/support/attachments.rb +4 -0
- data/spec/support/controller_behaviors.rb +28 -0
- data/spec/support/conversations.rb +13 -0
- data/spec/support/groups.rb +3 -0
- data/spec/support/loaded_site.rb +3 -0
- data/spec/support/messages.rb +23 -0
- data/spec/support/roles.rb +4 -0
- data/spec/support/users.rb +6 -0
- data/spec/support/wysihtml5_helper.rb +8 -0
- metadata +99 -12
- data/spec/dummy/app/assets/files/message_train/attachments/Haie_rci.svg +0 -1714
- data/spec/dummy/public/capybara.html +0 -193
@@ -0,0 +1,48 @@
|
|
1
|
+
module MessageTrain
|
2
|
+
module CollectivesHelper
|
3
|
+
|
4
|
+
def collective_boxes_widget(collective, box_user)
|
5
|
+
render partial: 'message_train/collectives/widget', locals: { collective: collective, box_user: box_user }
|
6
|
+
end
|
7
|
+
|
8
|
+
def collective_nav_item(box, box_user)
|
9
|
+
text = collective_name(box.parent)
|
10
|
+
if box.parent.allows_receiving_by? box_user
|
11
|
+
division = :in
|
12
|
+
elsif box.parent.allows_sending_by? box_user
|
13
|
+
division = :sent
|
14
|
+
else
|
15
|
+
return
|
16
|
+
end
|
17
|
+
link = message_train.collective_box_path(box.parent.path_part, division)
|
18
|
+
unread_count = box.unread_count
|
19
|
+
if unread_count > 0
|
20
|
+
text << badge(unread_count.to_s, 'info pull-right')
|
21
|
+
end
|
22
|
+
nav_item text.html_safe, link
|
23
|
+
end
|
24
|
+
|
25
|
+
def collective_list_item(box, html_options = {})
|
26
|
+
render partial: 'message_train/collectives/list_item', locals: { box: box, html_options: html_options, unread_count: box.unread_count }
|
27
|
+
end
|
28
|
+
|
29
|
+
def collective_boxes_dropdown_list(box_user)
|
30
|
+
total_unread_count = {}
|
31
|
+
show = {}
|
32
|
+
box_user.collective_boxes.each do |table_sym, collectives|
|
33
|
+
total_unread_count[table_sym] = collectives.collect { |collective_box| collective_box.unread_count }.sum
|
34
|
+
show[table_sym] = collectives.select { |collective_box| collective_box.parent.allows_sending_by?(box_user) || collective_box.parent.allows_receiving_by?(box_user) }.any?
|
35
|
+
end
|
36
|
+
render partial: 'message_train/collectives/dropdown_list', locals: { collective_boxes: box_user.collective_boxes, total_unread_count: total_unread_count, show: show, box_user: box_user }
|
37
|
+
end
|
38
|
+
|
39
|
+
def collective_name(collective)
|
40
|
+
collective.send(MessageTrain.configuration.name_columns[collective.class.table_name.to_sym])
|
41
|
+
end
|
42
|
+
|
43
|
+
def collective_slug(collective)
|
44
|
+
collective.send(MessageTrain.configuration.slug_columns[collective.class.table_name.to_sym])
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -1,40 +1,44 @@
|
|
1
1
|
module MessageTrain
|
2
2
|
module ConversationsHelper
|
3
3
|
def conversation_senders(conversation)
|
4
|
-
|
4
|
+
names = []
|
5
|
+
conversation.messages.each do |message|
|
6
|
+
names << box_participant_name(message.sender)
|
7
|
+
end
|
8
|
+
names.uniq.to_sentence
|
5
9
|
end
|
6
10
|
|
7
11
|
def conversation_class(box, conversation)
|
8
12
|
css_classes = []
|
9
13
|
|
10
|
-
if conversation.includes_unread_for?(@
|
14
|
+
if conversation.includes_unread_for?(@box_user)
|
11
15
|
css_classes << 'unread'
|
12
16
|
else
|
13
17
|
css_classes << 'read'
|
14
18
|
end
|
15
19
|
|
16
|
-
if conversation.includes_drafts_by?(@
|
20
|
+
if conversation.includes_drafts_by?(@box_user)
|
17
21
|
css_classes << 'draft'
|
18
22
|
end
|
19
23
|
|
20
|
-
unless conversation.includes_undeleted_for?(
|
24
|
+
unless conversation.includes_undeleted_for?(@box_user)
|
21
25
|
css_classes << 'hide'
|
22
26
|
end
|
23
27
|
|
24
28
|
if box.division == :trash
|
25
|
-
unless conversation.includes_trashed_for?(
|
29
|
+
unless conversation.includes_trashed_for?(@box_user)
|
26
30
|
css_classes << 'hide'
|
27
31
|
end
|
28
32
|
else
|
29
|
-
unless conversation.includes_untrashed_for?(
|
33
|
+
unless conversation.includes_untrashed_for?(@box_user)
|
30
34
|
css_classes << 'hide'
|
31
35
|
end
|
32
36
|
if box.division == :ignored
|
33
|
-
unless conversation.is_ignored?(
|
37
|
+
unless conversation.is_ignored?(@box_user)
|
34
38
|
css_classes << 'hide'
|
35
39
|
end
|
36
40
|
else
|
37
|
-
if conversation.is_ignored?(
|
41
|
+
if conversation.is_ignored?(@box_user)
|
38
42
|
css_classes << 'hide'
|
39
43
|
end
|
40
44
|
end
|
@@ -42,26 +46,30 @@ module MessageTrain
|
|
42
46
|
css_classes.uniq.join(' ')
|
43
47
|
end
|
44
48
|
|
45
|
-
def conversation_trashed_toggle(conversation)
|
46
|
-
render partial: 'message_train/conversations/trashed_toggle', locals: { conversation: conversation }
|
49
|
+
def conversation_trashed_toggle(conversation, collective = nil)
|
50
|
+
render partial: 'message_train/conversations/trashed_toggle', locals: { conversation: conversation, collective: collective }
|
47
51
|
end
|
48
52
|
|
49
|
-
def conversation_read_toggle(conversation)
|
50
|
-
render partial: 'message_train/conversations/read_toggle', locals: { conversation: conversation }
|
53
|
+
def conversation_read_toggle(conversation, collective = nil)
|
54
|
+
render partial: 'message_train/conversations/read_toggle', locals: { conversation: conversation, collective: collective }
|
51
55
|
end
|
52
56
|
|
53
|
-
def conversation_ignored_toggle(conversation)
|
54
|
-
render partial: 'message_train/conversations/ignored_toggle', locals: { conversation: conversation }
|
57
|
+
def conversation_ignored_toggle(conversation, collective = nil)
|
58
|
+
render partial: 'message_train/conversations/ignored_toggle', locals: { conversation: conversation, collective: collective }
|
55
59
|
end
|
56
60
|
|
57
|
-
def conversation_deleted_toggle(conversation)
|
58
|
-
render partial: 'message_train/conversations/deleted_toggle', locals: { conversation: conversation }
|
61
|
+
def conversation_deleted_toggle(conversation, collective = nil)
|
62
|
+
render partial: 'message_train/conversations/deleted_toggle', locals: { conversation: conversation, collective: collective }
|
59
63
|
end
|
60
64
|
|
65
|
+
private
|
66
|
+
|
61
67
|
def conversation_toggle(conversation, icon, mark_to_set, method, title, options = {})
|
62
68
|
options[:remote] = true
|
63
69
|
options[:method] = method
|
64
70
|
options[:title] = title
|
71
|
+
options[:class] ||= ""
|
72
|
+
options[:class] += " " + mark_to_set.to_s + "-toggle"
|
65
73
|
render partial: 'message_train/conversations/toggle', locals: {
|
66
74
|
conversation: conversation,
|
67
75
|
icon: icon,
|
@@ -3,7 +3,7 @@ module MessageTrain
|
|
3
3
|
def message_class(box, message)
|
4
4
|
css_classes = []
|
5
5
|
|
6
|
-
if message.is_unread_for?(@
|
6
|
+
if message.is_unread_for?(@box_user)
|
7
7
|
css_classes << 'unread panel-info'
|
8
8
|
else
|
9
9
|
css_classes << 'read'
|
@@ -14,11 +14,11 @@ module MessageTrain
|
|
14
14
|
end
|
15
15
|
|
16
16
|
if box.division == :trash
|
17
|
-
unless message.is_trashed_for?(
|
17
|
+
unless message.is_trashed_for?(@box_user)
|
18
18
|
css_classes << 'hide'
|
19
19
|
end
|
20
20
|
else
|
21
|
-
unless message.is_untrashed_for?(
|
21
|
+
unless message.is_untrashed_for?(@box_user)
|
22
22
|
css_classes << 'hide'
|
23
23
|
end
|
24
24
|
end
|
@@ -37,6 +37,12 @@ module MessageTrain
|
|
37
37
|
render partial: 'message_train/messages/deleted_toggle', locals: { message: message }
|
38
38
|
end
|
39
39
|
|
40
|
+
def message_recipients(message)
|
41
|
+
message.recipients.collect { |x| box_participant_name(x) }.to_sentence
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
40
46
|
def message_toggle(message, icon, mark_to_set, title, options = {})
|
41
47
|
options[:remote] = true
|
42
48
|
options[:id] = "mark_#{mark_to_set}_#{message.id}"
|
@@ -44,15 +50,11 @@ module MessageTrain
|
|
44
50
|
options[:method] = :put
|
45
51
|
options[:title] = title
|
46
52
|
render partial: 'message_train/messages/toggle', locals: {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
def message_recipients(message)
|
55
|
-
message.recipients.collect { |x| box_participant_name(x) }.to_sentence
|
53
|
+
message: message,
|
54
|
+
icon: icon,
|
55
|
+
mark_to_set: mark_to_set,
|
56
|
+
options: options
|
57
|
+
}
|
56
58
|
end
|
57
59
|
end
|
58
60
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MessageTrain
|
2
|
+
class ReceiptMailer < ApplicationMailer
|
3
|
+
def notification_email(receipt)
|
4
|
+
@receipt = receipt
|
5
|
+
@recipient = receipt.recipient
|
6
|
+
@through = receipt.received_through
|
7
|
+
if @recipient == @through
|
8
|
+
@heading = :new_message_on_site_name.l(site_name: MessageTrain.configuration.site_name)
|
9
|
+
else
|
10
|
+
@through_name = @through.send(MessageTrain.configuration.name_columns[@through.class.table_name.to_sym])
|
11
|
+
@heading = :new_message_through_on_site_name.l(site_name: MessageTrain.configuration.site_name, through: @through_name)
|
12
|
+
end
|
13
|
+
@subject = "#{@heading}: #{@receipt.message.subject}"
|
14
|
+
mail(to: @recipient.email, subject: @subject)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,17 +1,35 @@
|
|
1
1
|
module MessageTrain
|
2
2
|
class Attachment < ActiveRecord::Base
|
3
3
|
belongs_to :message
|
4
|
-
has_attached_file :attachment
|
4
|
+
has_attached_file :attachment, styles: lambda { |attachment|
|
5
|
+
attachment.instance.image? ? {
|
6
|
+
thumb: '235x',
|
7
|
+
large: '800x'
|
8
|
+
} : {}
|
9
|
+
},
|
10
|
+
path: ':rails_root/public/system/:rails_env/:class/:attachment/:id_partition/:style_prefix:filename',
|
11
|
+
url: '/system/:rails_env/:class/:attachment/:id_partition/:style_prefix:filename',
|
12
|
+
convert_options: {
|
13
|
+
large: '-quality 75 -interlace Plane -strip',
|
14
|
+
thumb: '-quality 75 -strip',
|
15
|
+
}
|
5
16
|
validates_attachment_presence :attachment
|
6
17
|
validates_attachment_content_type :attachment, content_type: [
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
/^image
|
18
|
+
'application/pdf',
|
19
|
+
'application/vnd.ms-excel',
|
20
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
21
|
+
'application/msword',
|
22
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
23
|
+
'application/rtf',
|
24
|
+
'text/plain',
|
25
|
+
/^(image|(x-)?application)\/(bmp|gif|jpeg|jpg|pjpeg|png|x-png)$/
|
15
26
|
]
|
27
|
+
def image?
|
28
|
+
(attachment_content_type =~ /^(image|(x-)?application)\/(bmp|gif|jpeg|jpg|pjpeg|png|x-png)$/) ? true : false
|
29
|
+
end
|
30
|
+
|
31
|
+
Paperclip.interpolates :style_prefix do |attachment, style|
|
32
|
+
attachment.instance.image? ? "#{style.to_s}/" : ''
|
33
|
+
end
|
16
34
|
end
|
17
|
-
end
|
35
|
+
end
|
@@ -1,57 +1,62 @@
|
|
1
1
|
module MessageTrain
|
2
2
|
class Box
|
3
3
|
include ActiveModel::Model
|
4
|
-
attr_accessor :parent, :division, :errors, :results
|
4
|
+
attr_accessor :parent, :division, :participant, :errors, :results
|
5
5
|
alias_method :id, :division
|
6
6
|
|
7
|
-
def initialize(parent, division)
|
7
|
+
def initialize(parent, division, participant = nil)
|
8
8
|
@parent = parent
|
9
|
+
@participant = participant || parent
|
9
10
|
@division = division
|
10
11
|
@results = Results.new(self)
|
11
12
|
@errors = Errors.new(self)
|
12
13
|
end
|
13
14
|
|
14
|
-
def marks
|
15
|
-
{ conversations: nil }
|
16
|
-
end
|
17
|
-
|
18
15
|
def to_param
|
19
16
|
division.to_s
|
20
17
|
end
|
21
18
|
|
22
19
|
def unread_count
|
23
|
-
conversations(unread: true)
|
20
|
+
found = conversations(unread: true)
|
21
|
+
# # This fixed a bug that only Travis seemed to pick up, but it's code smell.
|
22
|
+
# if found.nil?
|
23
|
+
# 0
|
24
|
+
# else
|
25
|
+
# found.count
|
26
|
+
# end
|
27
|
+
found.count
|
24
28
|
end
|
25
29
|
|
26
30
|
def conversations(options = {})
|
27
|
-
found = parent.conversations(division)
|
31
|
+
found = parent.conversations(division, participant)
|
32
|
+
found = found.with_undeleted_for(participant)
|
28
33
|
if options[:read] == false || options[:unread]
|
29
|
-
found = found.with_unread_for(
|
34
|
+
found = found.with_unread_for(participant)
|
30
35
|
end
|
31
36
|
if division == :trash
|
32
|
-
found = found.with_trashed_for(
|
37
|
+
found = found.with_trashed_for(participant)
|
33
38
|
else
|
34
|
-
found = found.with_untrashed_for(
|
39
|
+
found = found.with_untrashed_for(participant)
|
35
40
|
if division == :drafts
|
36
|
-
found = found.with_drafts_by(
|
41
|
+
found = found.with_drafts_by(participant)
|
37
42
|
else
|
38
|
-
found = found.with_ready_for(
|
43
|
+
found = found.with_ready_for(participant)
|
39
44
|
end
|
40
45
|
if division == :ignored
|
41
|
-
found = found.ignored(
|
46
|
+
found = found.ignored(participant)
|
42
47
|
else
|
43
|
-
found = found.unignored(
|
48
|
+
found = found.unignored(participant)
|
44
49
|
end
|
45
50
|
end
|
46
51
|
found
|
47
52
|
end
|
48
53
|
|
49
54
|
def find_conversation(id)
|
50
|
-
parent.all_conversations.find(id)
|
55
|
+
parent.all_conversations(participant).find(id)
|
51
56
|
end
|
52
57
|
|
53
58
|
def find_message(id)
|
54
|
-
parent.all_messages.find(id)
|
59
|
+
parent.all_messages(participant).find(id)
|
55
60
|
end
|
56
61
|
|
57
62
|
def new_message(args = {})
|
@@ -59,8 +64,10 @@ module MessageTrain
|
|
59
64
|
message = MessageTrain::Message.new(args)
|
60
65
|
else
|
61
66
|
conversation = find_conversation(args[:conversation_id])
|
67
|
+
previous_message = conversation.messages.last
|
62
68
|
message = conversation.messages.build(args)
|
63
69
|
message.subject = "Re: #{conversation.subject}"
|
70
|
+
message.body = "<blockquote>#{previous_message.body}</blockquote><p> </p>"
|
64
71
|
recipient_arrays = {}
|
65
72
|
conversation.default_recipients_for(parent).each do |recipient|
|
66
73
|
table_name = recipient.class.table_name
|
@@ -76,8 +83,18 @@ module MessageTrain
|
|
76
83
|
|
77
84
|
def send_message(attributes)
|
78
85
|
message_to_send = MessageTrain::Message.new attributes
|
79
|
-
message_to_send.sender =
|
80
|
-
unless
|
86
|
+
message_to_send.sender = participant
|
87
|
+
unless parent.valid_senders.include? participant
|
88
|
+
errors.add(message_to_send, :invalid_sender_for_thing.l(thing: "#{parent.class.name} #{parent.id}"))
|
89
|
+
return false
|
90
|
+
end
|
91
|
+
if message_to_send.save
|
92
|
+
if message_to_send.draft
|
93
|
+
results.add(message_to_send, :message_saved_as_draft.l)
|
94
|
+
else
|
95
|
+
results.add(message_to_send, :message_sent.l)
|
96
|
+
end
|
97
|
+
else
|
81
98
|
errors.add(message_to_send, message_to_send.errors.full_messages.to_sentence)
|
82
99
|
end
|
83
100
|
message_to_send
|
@@ -85,15 +102,23 @@ module MessageTrain
|
|
85
102
|
|
86
103
|
def update_message(message_to_update, attributes)
|
87
104
|
attributes.delete(:sender)
|
88
|
-
if message_to_update.sender == parent
|
105
|
+
if message_to_update.sender == participant && parent.valid_senders.include?(participant)
|
89
106
|
message_to_update.update(attributes)
|
90
|
-
|
107
|
+
message_to_update.reload
|
108
|
+
if message_to_update.errors.empty?
|
109
|
+
if message_to_update.draft
|
110
|
+
results.add(message_to_update, :message_saved_as_draft.l)
|
111
|
+
else
|
112
|
+
results.add(message_to_update, :message_sent.l)
|
113
|
+
end
|
114
|
+
else
|
91
115
|
errors.add(message_to_update, message_to_update.errors.full_messages.to_sentence)
|
92
116
|
end
|
117
|
+
message_to_update
|
93
118
|
else
|
94
119
|
errors.add(message_to_update, :access_to_message_id_denied.l(id: message_to_update.id))
|
120
|
+
false
|
95
121
|
end
|
96
|
-
message_to_update.reload
|
97
122
|
end
|
98
123
|
|
99
124
|
def ignore(object)
|
@@ -103,20 +128,13 @@ module MessageTrain
|
|
103
128
|
when 'Array'
|
104
129
|
object.collect { |item| ignore(item) }.uniq == [true]
|
105
130
|
when 'String', 'Fixnum'
|
106
|
-
|
107
|
-
object = parent.all_conversations.find_by_id(id)
|
108
|
-
if object.nil?
|
109
|
-
errors.add(self, :class_id_not_found_in_box.l(class: 'Conversation', id: id.to_s))
|
110
|
-
else
|
111
|
-
ignore(object)
|
112
|
-
end
|
131
|
+
ignore(find_conversation(object.to_i))
|
113
132
|
when 'MessageTrain::Conversation'
|
114
133
|
if authorize(object)
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
134
|
+
object.set_ignored(participant)
|
135
|
+
# We can assume the previous line has succeeded at this point, because set_ignored raises
|
136
|
+
# an ActiveRecord error otherwise. Therefore we simply report success, since we got here.
|
137
|
+
results.add(object, :update_successful.l)
|
120
138
|
else
|
121
139
|
false
|
122
140
|
end
|
@@ -132,25 +150,18 @@ module MessageTrain
|
|
132
150
|
when 'Array'
|
133
151
|
object.collect { |item| unignore(item) }.uniq == [true]
|
134
152
|
when 'String', 'Fixnum'
|
135
|
-
|
136
|
-
object = parent.all_conversations.find_by_id(id)
|
137
|
-
if object.nil?
|
138
|
-
errors.add(self, :class_id_not_found_in_box.l(class: 'Conversation', id: id.to_s))
|
139
|
-
else
|
140
|
-
unignore(object)
|
141
|
-
end
|
153
|
+
unignore(find_conversation(object.to_i))
|
142
154
|
when 'MessageTrain::Conversation'
|
143
155
|
if authorize(object)
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
end
|
156
|
+
object.set_unignored(participant)
|
157
|
+
# We can assume the previous line has succeeded at this point, because set_unignored raises
|
158
|
+
# an ActiveRecord error otherwise. Therefore we simply report success, since we got here.
|
159
|
+
results.add(object, :update_successful.l)
|
149
160
|
else
|
150
161
|
false
|
151
162
|
end
|
152
163
|
else
|
153
|
-
errors.add(self, :
|
164
|
+
errors.add(self, :cannot_unignore_type.l(type: object.class.name))
|
154
165
|
end
|
155
166
|
end
|
156
167
|
|
@@ -170,33 +181,33 @@ module MessageTrain
|
|
170
181
|
|
171
182
|
def mark(mark_to_set, objects)
|
172
183
|
objects.each do |key, object|
|
173
|
-
if object.present?
|
174
|
-
|
184
|
+
if !object.present?
|
185
|
+
# Allow skipping empty objects
|
186
|
+
elsif key.to_s =~ /^(conversations|messages)$/
|
187
|
+
data_type = object.class.name
|
188
|
+
case data_type
|
175
189
|
when 'Hash'
|
176
190
|
mark(mark_to_set, { key => object.values } )
|
177
191
|
when 'Array'
|
178
192
|
object.collect { |item| mark(mark_to_set, key => item) }.uniq == [true]
|
179
193
|
when 'String', 'Fixnum'
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
errors.add(self, :class_id_not_found_in_box.l(class: key.to_s.classify, id: id.to_s))
|
184
|
-
else
|
185
|
-
mark(mark_to_set, key => object)
|
186
|
-
end
|
194
|
+
model_name = "MessageTrain::#{key.to_s.classify}"
|
195
|
+
model = model_name.constantize
|
196
|
+
mark(mark_to_set, key => model.find_by_id!(object.to_i))
|
187
197
|
when 'MessageTrain::Conversation', 'MessageTrain::Message'
|
188
198
|
if authorize(object)
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
end
|
199
|
+
object.mark(mark_to_set, participant)
|
200
|
+
# We can assume the previous line has succeeded at this point, because mark raises
|
201
|
+
# an ActiveRecord error otherwise. Therefore we simply report success, since we got here.
|
202
|
+
results.add(object, :update_successful.l)
|
194
203
|
else
|
195
204
|
false
|
196
205
|
end
|
197
206
|
else
|
198
|
-
|
207
|
+
errors.add(self, :cannot_mark_with_data_type.l(data_type: data_type))
|
199
208
|
end
|
209
|
+
else
|
210
|
+
errors.add(self, :cannot_mark_type.l(type: key.to_s))
|
200
211
|
end
|
201
212
|
end
|
202
213
|
end
|
@@ -204,19 +215,19 @@ module MessageTrain
|
|
204
215
|
def authorize(object)
|
205
216
|
case object.class.name
|
206
217
|
when 'MessageTrain::Conversation'
|
207
|
-
if object.includes_receipts_for?
|
218
|
+
if object.includes_receipts_for? participant
|
208
219
|
true
|
209
220
|
else
|
210
221
|
errors.add(object, :access_to_conversation_id_denied.l(id: object.id))
|
211
222
|
end
|
212
223
|
when 'MessageTrain::Message'
|
213
|
-
if object.receipts.for(
|
224
|
+
if object.receipts.for(participant).any?
|
214
225
|
true
|
215
226
|
else
|
216
227
|
errors.add(object, :access_to_message_id_denied.l(id: object.id))
|
217
228
|
end
|
218
229
|
else
|
219
|
-
errors.add(object, :
|
230
|
+
errors.add(object, :cannot_authorize_type.l(type: object.class.name))
|
220
231
|
end
|
221
232
|
end
|
222
233
|
|
@@ -230,24 +241,44 @@ module MessageTrain
|
|
230
241
|
|
231
242
|
def add(object, message)
|
232
243
|
item = {}
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
244
|
+
case object.class.name
|
245
|
+
when 'MessageTrain::Box'
|
246
|
+
item[:css_id] = 'box'
|
247
|
+
route_args = {
|
248
|
+
controller: 'message_train/boxes',
|
249
|
+
action: :show,
|
250
|
+
division: object.division
|
251
|
+
}
|
252
|
+
if box.parent != box.participant
|
253
|
+
collective = box.parent
|
254
|
+
table_part = collective.class.table_name
|
255
|
+
slug_part = collective.send(MessageTrain.configuration.slug_columns[collective.class.table_name.to_sym])
|
256
|
+
route_args[:collective_id] = "#{table_part}:#{slug_part}"
|
257
|
+
end
|
258
|
+
item[:path] = MessageTrain::Engine.routes.path_for(route_args)
|
259
|
+
when 'MessageTrain::Conversation', 'MessageTrain::Message'
|
260
|
+
if object.new_record?
|
261
|
+
item[:css_id] = "#{object.class.table_name.singularize}"
|
262
|
+
item[:path] = nil
|
263
|
+
else
|
264
|
+
item[:css_id] = "#{object.class.table_name.singularize}_#{object.id.to_s}"
|
265
|
+
route_args = {
|
266
|
+
controller: object.class.table_name.gsub('message_train_', 'message_train/'),
|
267
|
+
action: :show,
|
268
|
+
box_division: box.division,
|
269
|
+
id: object.id
|
270
|
+
}
|
271
|
+
if box.parent != box.participant
|
272
|
+
collective = box.parent
|
273
|
+
table_part = collective.class.table_name
|
274
|
+
slug_part = collective.send(MessageTrain.configuration.slug_columns[collective.class.table_name.to_sym])
|
275
|
+
route_args[:collective_id] = "#{table_part}:#{slug_part}"
|
276
|
+
end
|
277
|
+
item[:path] = MessageTrain::Engine.routes.path_for(route_args)
|
278
|
+
end
|
279
|
+
else
|
280
|
+
item[:css_id] = "#{object.class.name.singularize.downcase}"
|
281
|
+
item[:path] = nil
|
251
282
|
end
|
252
283
|
item[:message] = message
|
253
284
|
items << item
|