enju_trunk_message 0.1.14.pre3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +46 -0
  4. data/app/controllers/message_requests_controller.rb +62 -0
  5. data/app/controllers/message_templates_controller.rb +17 -0
  6. data/app/controllers/messages_controller.rb +159 -0
  7. data/app/helpers/messages_helper.rb +2 -0
  8. data/app/models/message.rb +85 -0
  9. data/app/models/message_request.rb +97 -0
  10. data/app/models/message_template.rb +39 -0
  11. data/app/views/layouts/messages.html.erb +24 -0
  12. data/app/views/message_requests/edit.html.erb +40 -0
  13. data/app/views/message_requests/index.html.erb +58 -0
  14. data/app/views/message_requests/new.html.erb +40 -0
  15. data/app/views/message_requests/show.html.erb +55 -0
  16. data/app/views/message_templates/_form.html.erb +27 -0
  17. data/app/views/message_templates/edit.html.erb +13 -0
  18. data/app/views/message_templates/index.html.erb +44 -0
  19. data/app/views/message_templates/new.html.erb +12 -0
  20. data/app/views/message_templates/show.html.erb +33 -0
  21. data/app/views/messages/_form.html.erb +37 -0
  22. data/app/views/messages/edit.html.erb +42 -0
  23. data/app/views/messages/index.atom.builder +15 -0
  24. data/app/views/messages/index.html.erb +66 -0
  25. data/app/views/messages/index.rss.builder +41 -0
  26. data/app/views/messages/new.html.erb +43 -0
  27. data/app/views/messages/show.html.erb +48 -0
  28. data/app/views/notifier/message_notification.en.text.erb +14 -0
  29. data/app/views/notifier/message_notification.ja.text.erb +14 -0
  30. data/config/locales/translation_en.yml +51 -0
  31. data/config/locales/translation_ja.yml +51 -0
  32. data/config/routes.rb +9 -0
  33. data/db/fixtures/message_templates.yml +70 -0
  34. data/db/migrate/149_create_message_templates.rb +18 -0
  35. data/db/migrate/154_create_messages.rb +24 -0
  36. data/db/migrate/20080819181903_create_message_requests.rb +20 -0
  37. data/db/migrate/20110913115320_add_lft_and_rgt_to_message.rb +11 -0
  38. data/db/migrate/20120125050502_add_depth_to_message.rb +6 -0
  39. data/lib/enju_message.rb +7 -0
  40. data/lib/enju_message/engine.rb +10 -0
  41. data/lib/enju_message/user.rb +28 -0
  42. data/lib/enju_message/version.rb +3 -0
  43. data/lib/generators/enju_message/views_generator.rb +21 -0
  44. data/lib/tasks/enju_message_tasks.rake +5 -0
  45. data/spec/controllers/message_requests_controller_spec.rb +275 -0
  46. data/spec/controllers/message_templates_controller_spec.rb +439 -0
  47. data/spec/controllers/messages_controller_spec.rb +443 -0
  48. data/spec/dummy/Rakefile +7 -0
  49. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  50. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  51. data/spec/dummy/app/controllers/application_controller.rb +52 -0
  52. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  53. data/spec/dummy/app/mailers/notifier.rb +30 -0
  54. data/spec/dummy/app/models/ability.rb +30 -0
  55. data/spec/dummy/app/models/library_group.rb +86 -0
  56. data/spec/dummy/app/models/patron.rb +167 -0
  57. data/spec/dummy/app/models/patron_type.rb +19 -0
  58. data/spec/dummy/app/models/role.rb +8 -0
  59. data/spec/dummy/app/models/setting.rb +4 -0
  60. data/spec/dummy/app/models/user.rb +46 -0
  61. data/spec/dummy/app/models/user_group.rb +2 -0
  62. data/spec/dummy/app/models/user_has_role.rb +4 -0
  63. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  64. data/spec/dummy/app/views/page/403.html.erb +9 -0
  65. data/spec/dummy/app/views/page/403.mobile.erb +5 -0
  66. data/spec/dummy/app/views/page/403.xml.erb +4 -0
  67. data/spec/dummy/app/views/page/404.html.erb +9 -0
  68. data/spec/dummy/app/views/page/404.mobile.erb +5 -0
  69. data/spec/dummy/app/views/page/404.xml.erb +4 -0
  70. data/spec/dummy/config.ru +4 -0
  71. data/spec/dummy/config/application.rb +44 -0
  72. data/spec/dummy/config/application.yml +38 -0
  73. data/spec/dummy/config/boot.rb +10 -0
  74. data/spec/dummy/config/database.yml +25 -0
  75. data/spec/dummy/config/environment.rb +5 -0
  76. data/spec/dummy/config/environments/development.rb +30 -0
  77. data/spec/dummy/config/environments/production.rb +60 -0
  78. data/spec/dummy/config/environments/test.rb +39 -0
  79. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  80. data/spec/dummy/config/initializers/devise.rb +205 -0
  81. data/spec/dummy/config/initializers/inflections.rb +10 -0
  82. data/spec/dummy/config/initializers/mime_types.rb +6 -0
  83. data/spec/dummy/config/initializers/resque_mailer.rb +1 -0
  84. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  85. data/spec/dummy/config/initializers/session_store.rb +8 -0
  86. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  87. data/spec/dummy/config/locales/en.yml +5 -0
  88. data/spec/dummy/config/routes.rb +60 -0
  89. data/spec/dummy/db/migrate/001_create_patrons.rb +62 -0
  90. data/spec/dummy/db/migrate/080_create_library_groups.rb +25 -0
  91. data/spec/dummy/db/migrate/20080905191442_create_patron_types.rb +16 -0
  92. data/spec/dummy/db/migrate/20100211105551_add_admin_networks_to_library_group.rb +9 -0
  93. data/spec/dummy/db/migrate/20100222124420_add_allow_bookmark_external_url_to_library_group.rb +9 -0
  94. data/spec/dummy/db/migrate/20100527113752_create_delayed_jobs.rb +21 -0
  95. data/spec/dummy/db/migrate/20110115022329_add_position_to_library_group.rb +9 -0
  96. data/spec/dummy/db/migrate/20110222073537_add_url_to_library_group.rb +9 -0
  97. data/spec/dummy/db/migrate/20111020063828_remove_dsbl_from_library_group.rb +11 -0
  98. data/spec/dummy/db/migrate/20111201121636_create_languages.rb +16 -0
  99. data/spec/dummy/db/migrate/20111201121844_create_roles.rb +12 -0
  100. data/spec/dummy/db/migrate/20111201155456_create_users.rb +14 -0
  101. data/spec/dummy/db/migrate/20111201155513_add_devise_to_users.rb +52 -0
  102. data/spec/dummy/db/migrate/20111201163342_create_user_groups.rb +12 -0
  103. data/spec/dummy/db/migrate/20111201163718_create_user_has_roles.rb +10 -0
  104. data/spec/dummy/db/migrate/20120213092115_add_queue_to_delayed_jobs.rb +9 -0
  105. data/spec/dummy/db/schema.rb +236 -0
  106. data/spec/dummy/public/404.html +26 -0
  107. data/spec/dummy/public/422.html +26 -0
  108. data/spec/dummy/public/500.html +26 -0
  109. data/spec/dummy/public/favicon.ico +0 -0
  110. data/spec/dummy/script/delayed_job +5 -0
  111. data/spec/dummy/script/rails +6 -0
  112. data/spec/factories/message.rb +8 -0
  113. data/spec/factories/message_request.rb +8 -0
  114. data/spec/factories/message_template.rb +7 -0
  115. data/spec/factories/user.rb +34 -0
  116. data/spec/fixtures/library_groups.yml +34 -0
  117. data/spec/fixtures/message_requests.yml +30 -0
  118. data/spec/fixtures/message_templates.yml +85 -0
  119. data/spec/fixtures/messages.yml +62 -0
  120. data/spec/fixtures/patrons.yml +338 -0
  121. data/spec/fixtures/roles.yml +21 -0
  122. data/spec/fixtures/user_groups.yml +25 -0
  123. data/spec/fixtures/user_has_roles.yml +41 -0
  124. data/spec/fixtures/users.yml +71 -0
  125. data/spec/models/message_request_spec.rb +24 -0
  126. data/spec/models/message_spec.rb +59 -0
  127. data/spec/models/message_template_spec.rb +22 -0
  128. data/spec/spec_helper.rb +46 -0
  129. data/spec/support/controller_macros.rb +48 -0
  130. data/spec/support/devise.rb +4 -0
  131. metadata +440 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 Kosuke Tanabe
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = EnjuMessage {<img src="https://secure.travis-ci.org/nabeta/enju_message.png?branch=master" alt="Build Status" />}[http://travis-ci.org/nabeta/enju_message]
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'EnjuMessage'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+ Bundler::GemHelper.install_tasks
28
+
29
+ require 'rake/testtask'
30
+
31
+ Rake::TestTask.new(:test) do |t|
32
+ t.libs << 'lib'
33
+ t.libs << 'test'
34
+ t.pattern = 'test/**/*_test.rb'
35
+ t.verbose = false
36
+ end
37
+
38
+ require 'rspec/core'
39
+ require 'rspec/core/rake_task'
40
+
41
+ RSpec::Core::RakeTask.new(:spec) do |spec|
42
+ spec.pattern = FileList['spec/**/*_spec.rb']
43
+ end
44
+
45
+
46
+ task :default => :spec
@@ -0,0 +1,62 @@
1
+ class MessageRequestsController < ApplicationController
2
+ load_and_authorize_resource :except => :create
3
+
4
+ # GET /message_requests
5
+ # GET /message_requests.json
6
+ def index
7
+ case params[:mode]
8
+ when 'sent'
9
+ @message_requests = MessageRequest.sent.order('created_at DESC').page(params[:page])
10
+ when 'all'
11
+ @message_requests = MessageRequest.order('created_at DESC').page(params[:page])
12
+ else
13
+ @message_requests = MessageRequest.not_sent.order('created_at DESC').page(params[:page])
14
+ end
15
+
16
+ respond_to do |format|
17
+ format.html # index.html.erb
18
+ format.json { render :json => @message_requests }
19
+ end
20
+ end
21
+
22
+ # GET /message_requests/1
23
+ # GET /message_requests/1.json
24
+ def show
25
+ respond_to do |format|
26
+ format.html # show.html.erb
27
+ format.json { render :json => @message_request }
28
+ end
29
+ end
30
+
31
+ # GET /message_requests/1/edit
32
+ def edit
33
+ @message_templates = MessageTemplate.all
34
+ end
35
+
36
+ # PUT /message_requests/1
37
+ # PUT /message_requests/1.json
38
+ def update
39
+ respond_to do |format|
40
+ if @message_request.update_attributes(params[:message_request])
41
+ flash[:notice] = t('controller.successfully_updated', :model => t('activerecord.models.message_request'))
42
+ format.html { redirect_to(@message_request) }
43
+ format.json { head :no_content }
44
+ else
45
+ @message_templates = MessageTemplate.all
46
+ format.html { render :action => "edit" }
47
+ format.json { render :json => @message_request.errors, :status => :unprocessable_entity }
48
+ end
49
+ end
50
+ end
51
+
52
+ # DELETE /message_requests/1
53
+ # DELETE /message_requests/1.json
54
+ def destroy
55
+ @message_request.destroy
56
+
57
+ respond_to do |format|
58
+ format.html { redirect_to message_requests_url }
59
+ format.json { head :no_content }
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,17 @@
1
+ class MessageTemplatesController < InheritedResources::Base
2
+ respond_to :html, :json
3
+ load_and_authorize_resource
4
+
5
+ def update
6
+ @message_template = MessageTemplate.find(params[:id])
7
+ if params[:move]
8
+ move_position(@message_template, params[:move])
9
+ return
10
+ end
11
+ update!
12
+ end
13
+
14
+ def index
15
+ @message_templates = MessageTemplate.page(params[:page])
16
+ end
17
+ end
@@ -0,0 +1,159 @@
1
+ class MessagesController < ApplicationController
2
+ load_and_authorize_resource :except => :index
3
+ authorize_resource :only => :index
4
+ before_filter :get_user, :only => :index
5
+ after_filter :solr_commit, :only => [:create, :update, :destroy, :destroy_selected]
6
+
7
+ # GET /messages
8
+ # GET /messages.json
9
+ def index
10
+ query = params[:query].to_s.strip
11
+ search = Sunspot.new_search(Message)
12
+ user = current_user
13
+ case params[:mode]
14
+ when 'read'
15
+ is_read = true
16
+ when 'unread'
17
+ is_read = false
18
+ else
19
+ is_read = nil
20
+ end
21
+ search.build do
22
+ fulltext query
23
+ order_by :created_at, :desc
24
+ with(:receiver_id).equal_to user.id
25
+ facet(:is_read)
26
+ end
27
+ @message_facet = search.execute!.facet('is_read').rows
28
+ search.build do
29
+ with(:is_read).equal_to is_read unless is_read.nil?
30
+ end
31
+ page = params[:page] || 1
32
+ search.query.paginate(page.to_i, Message.default_per_page)
33
+ @messages = search.execute!.results
34
+
35
+ respond_to do |format|
36
+ format.html # index.html.erb
37
+ format.json { render :json => @messages }
38
+ format.rss
39
+ format.atom
40
+ end
41
+ end
42
+
43
+ # GET /messages/1
44
+ # GET /messages/1.json
45
+ def show
46
+ @message = current_user.received_messages.find(params[:id])
47
+ @message.sm_read!
48
+
49
+ respond_to do |format|
50
+ format.html # show.html.erb
51
+ format.json { render :json => @message }
52
+ end
53
+ end
54
+
55
+ # GET /messages/new
56
+ def new
57
+ parent = get_parent(params[:parent_id])
58
+ @message = current_user.sent_messages.new
59
+ if params[:recipient] && current_user.has_role?('Librarian')
60
+ @message.recipient = params[:recipient]
61
+ else
62
+ @message.recipient = parent.sender.username if parent
63
+ end
64
+
65
+ respond_to do |format|
66
+ format.html # new.html.erb
67
+ format.json { render :json => @message }
68
+ end
69
+ end
70
+
71
+ # GET /messages/1/edit
72
+ def edit
73
+ @message = current_user.received_messages.find(params[:id])
74
+ @message.sm_read!
75
+ end
76
+
77
+ # POST /messages
78
+ # POST /messages.json
79
+ def create
80
+ @message = Message.new(params[:message])
81
+ @message.sender = current_user
82
+ get_parent(@message.parent_id)
83
+ @message.receiver = User.find(@message.recipient) rescue nil
84
+
85
+ respond_to do |format|
86
+ if @message.save
87
+ format.html { redirect_to messages_url, :notice => t('controller.successfully_created', :model => t('activerecord.models.message')) }
88
+ format.json { render :json => @message, :status => :created, :location => @message }
89
+ else
90
+ format.html { render :action => "new" }
91
+ format.json { render :json => @message.errors, :status => :unprocessable_entity }
92
+ end
93
+ end
94
+ end
95
+
96
+ # PUT /messages/1
97
+ # PUT /messages/1.json
98
+ def update
99
+ @message = current_user.received_messages.find(params[:id])
100
+
101
+ if @message.update_attributes(params[:message])
102
+ format.html { redirect_to @message, :notice => t('controller.successfully_updated', :model => t('activerecord.models.message')) }
103
+ format.json { head :no_content }
104
+ else
105
+ format.html { render :action => "edit" }
106
+ format.json { render :json => @message.errors, :status => :unprocessable_entity }
107
+ end
108
+ end
109
+
110
+ # DELETE /messages/1
111
+ # DELETE /messages/1.json
112
+ def destroy
113
+ @message = current_user.received_messages.find(params[:id])
114
+ @message.destroy
115
+
116
+ respond_to do |format|
117
+ format.html { redirect_to messages_url }
118
+ format.json { head :no_content }
119
+ end
120
+ end
121
+
122
+ def destroy_selected
123
+ if current_user
124
+ unless current_user.has_role?('Librarian')
125
+ access_denied
126
+ end
127
+ else
128
+ redirect_to new_user_session_url
129
+ return
130
+ end
131
+ respond_to do |format|
132
+ if params[:delete].present?
133
+ messages = params[:delete].map{|m| Message.find_by_id(m)}
134
+ end
135
+ if messages.present?
136
+ messages.each do |message|
137
+ message.destroy
138
+ end
139
+ flash[:notice] = t('message.messages_were_deleted')
140
+ format.html { redirect_to messages_url }
141
+ else
142
+ flash[:notice] = t('message.select_messages')
143
+ format.html { redirect_to messages_url }
144
+ end
145
+ end
146
+ end
147
+
148
+ private
149
+ def get_parent(id)
150
+ parent = Message.where(:id => id).first
151
+ unless current_user.has_role?('Librarian')
152
+ unless parent.try(:receiver) == current_user
153
+ access_denied; return
154
+ end
155
+ else
156
+ parent
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,2 @@
1
+ module MessagesHelper
2
+ end
@@ -0,0 +1,85 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class Message < ActiveRecord::Base
3
+ attr_accessible :subject, :body, :sender, :recipient, :parent_id
4
+ scope :unread, where(:state => 'unread')
5
+ belongs_to :message_request
6
+ belongs_to :sender, :class_name => 'User'
7
+ belongs_to :receiver, :class_name => 'User'
8
+ validates_presence_of :subject, :body #, :sender
9
+ validates_presence_of :recipient, :on => :create
10
+ validates_presence_of :receiver, :on => :update
11
+ before_save :set_receiver
12
+ after_save :index
13
+ after_destroy :remove_from_index
14
+ after_create :send_notification
15
+
16
+ acts_as_nested_set
17
+ attr_accessor :recipient
18
+
19
+ state_machine :initial => :unread do
20
+ before_transition any => :read, :do => :read
21
+ before_transition :read => :unread, :do => :unread
22
+
23
+ event :sm_read do
24
+ transition any => :read
25
+ end
26
+
27
+ event :sm_unread do
28
+ transition :read => :unread
29
+ end
30
+ end
31
+
32
+ searchable do
33
+ text :body, :subject
34
+ string :subject
35
+ integer :receiver_id
36
+ integer :sender_id
37
+ time :created_at
38
+ boolean :is_read do
39
+ self.read?
40
+ end
41
+ end
42
+
43
+ paginates_per 10
44
+
45
+ def set_receiver
46
+ if self.recipient
47
+ self.receiver = User.find(self.recipient)
48
+ end
49
+ end
50
+
51
+ def send_notification
52
+ Notifier.message_notification(id).deliver if receiver.try(:email).present?
53
+ end
54
+
55
+ def read
56
+ self.read_at = Time.zone.now unless self.read_at
57
+ self.save(:validate => false)
58
+ end
59
+
60
+ def read?
61
+ return true if state == 'read'
62
+ false
63
+ end
64
+ end
65
+
66
+ # == Schema Information
67
+ #
68
+ # Table name: messages
69
+ #
70
+ # id :integer not null, primary key
71
+ # read_at :datetime
72
+ # receiver_id :integer
73
+ # sender_id :integer
74
+ # subject :string(255) not null
75
+ # body :text
76
+ # message_request_id :integer
77
+ # state :string(255)
78
+ # parent_id :integer
79
+ # created_at :datetime not null
80
+ # updated_at :datetime not null
81
+ # lft :integer
82
+ # rgt :integer
83
+ # depth :integer
84
+ #
85
+
@@ -0,0 +1,97 @@
1
+ require 'erubis'
2
+ class MessageRequest < ActiveRecord::Base
3
+ attr_accessible :body
4
+ attr_accessible :sender, :receiver, :message_template, :body, :as => :admin
5
+ scope :not_sent, where('sent_at IS NULL AND state = ?', 'pending')
6
+ scope :sent, where(:state => 'sent')
7
+ scope :started, where(:state => 'started')
8
+ belongs_to :message_template, :validate => true
9
+ belongs_to :sender, :class_name => "User", :foreign_key => "sender_id", :validate => true
10
+ belongs_to :receiver, :class_name => "User", :foreign_key => "receiver_id", :validate => true
11
+ has_many :messages
12
+
13
+ validates_associated :sender, :receiver, :message_template
14
+ validates_presence_of :sender, :receiver, :message_template
15
+ validates_presence_of :body, :on => :update
16
+
17
+ state_machine :initial => :pending do
18
+ before_transition any - :sent => :sent, :do => :send_message
19
+
20
+ event :sm_send_message do
21
+ transition any - :sent => :sent
22
+ end
23
+
24
+ event :sm_start do
25
+ transition :pending => :started
26
+ end
27
+ end
28
+
29
+ paginates_per 10
30
+
31
+ def start_sending_message
32
+ sm_start!
33
+ sm_send_message!
34
+ end
35
+
36
+ def send_message
37
+ message = nil
38
+ MessageRequest.transaction do
39
+ if body
40
+ message = Message.new
41
+ message.sender = sender
42
+ message.recipient = receiver.username
43
+ message.subject = subject
44
+ message.body = body
45
+ message.save!
46
+ else
47
+ raise 'body is empty!'
48
+ end
49
+ self.sent_at = Time.zone.now
50
+ save(:validate => false)
51
+ if ['reservation_expired_for_patron', 'reservation_expired_for_patron'].include?(self.message_template.status)
52
+ self.receiver.reserves.each do |reserve|
53
+ reserve.expiration_notice_to_patron = true
54
+ reserve.save(:validate => false)
55
+ end
56
+ end
57
+ end
58
+ return message
59
+ end
60
+
61
+ def subject
62
+ message_template.title
63
+ end
64
+
65
+ def save_message_body(options = {})
66
+ options = {
67
+ :receiver => self.receiver,
68
+ :locale => self.receiver.locale
69
+ }.merge(options)
70
+ self.update_attributes!({:body => self.message_template.embed_body(options)})
71
+ end
72
+
73
+ def self.send_messages
74
+ count = MessageRequest.not_sent.size
75
+ MessageRequest.not_sent.each do |request|
76
+ request.start_sending_message
77
+ end
78
+ logger.info "#{Time.zone.now} sent #{count} messages!"
79
+ end
80
+ end
81
+
82
+ # == Schema Information
83
+ #
84
+ # Table name: message_requests
85
+ #
86
+ # id :integer not null, primary key
87
+ # sender_id :integer
88
+ # receiver_id :integer
89
+ # message_template_id :integer
90
+ # sent_at :datetime
91
+ # deleted_at :datetime
92
+ # body :text
93
+ # state :string(255)
94
+ # created_at :datetime not null
95
+ # updated_at :datetime not null
96
+ #
97
+