kit_cms 2.3.20 → 2.3.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/app/assets/images/kit/toolbar/smile.png +0 -0
  2. data/app/assets/images/kit/toolbar/wink.gif +0 -0
  3. data/app/assets/images/kit/toolbar/wink.png +0 -0
  4. data/app/assets/javascripts/codemirror/editor.js +55 -17
  5. data/app/assets/javascripts/codemirror/jquery.js +0 -1
  6. data/app/assets/javascripts/codemirror/ruby.js +196 -0
  7. data/app/assets/javascripts/jquery.js +3036 -2838
  8. data/app/assets/javascripts/kit/utilities.js +655 -586
  9. data/app/assets/stylesheets/codemirror/style.css +1 -1
  10. data/app/assets/stylesheets/codemirror/theme.css +23 -3
  11. data/app/assets/stylesheets/kit/calendar.css +6 -1
  12. data/app/assets/stylesheets/kit/cms/cms.css +36 -0
  13. data/app/assets/stylesheets/kit/forums.css +5 -1
  14. data/app/assets/stylesheets/kit/kit.css +3 -1
  15. data/app/controllers/account_controller.rb +306 -0
  16. data/app/controllers/ad_controller.rb +2 -0
  17. data/app/controllers/admin/ad_units_controller.rb +1 -1
  18. data/app/controllers/admin/ad_zones_controller.rb +15 -0
  19. data/app/controllers/admin/ads_controller.rb +5 -0
  20. data/app/controllers/admin/block_controller.rb +1 -65
  21. data/app/controllers/admin/blocks_controller.rb +2 -0
  22. data/app/controllers/admin/content_controller.rb +3 -1
  23. data/app/controllers/admin/dashboard_controller.rb +28 -4
  24. data/app/controllers/admin/dj_controller.rb +45 -0
  25. data/app/controllers/admin/help_controller.rb +1 -1
  26. data/app/controllers/admin/html_asset_controller.rb +0 -12
  27. data/app/controllers/admin/q_controller.rb +120 -0
  28. data/app/controllers/admin/user_controller.rb +4 -4
  29. data/app/controllers/api_controller.rb +34 -0
  30. data/app/controllers/calendar_controller.rb +1 -1
  31. data/app/controllers/form_controller.rb +3 -3
  32. data/app/controllers/forum_controller.rb +39 -29
  33. data/app/controllers/kit_controller.rb +42 -15
  34. data/app/controllers/pages_controller.rb +25 -5
  35. data/app/controllers/q_controller.rb +235 -0
  36. data/app/controllers/repo_controller.rb +7 -0
  37. data/app/controllers/user_controller.rb +14 -10
  38. data/app/controllers/utility_controller.rb +1 -1
  39. data/app/helpers/account_helper.rb +47 -0
  40. data/app/helpers/admin/layouts_helper.rb +8 -0
  41. data/app/helpers/admin/page_templates_helper.rb +8 -0
  42. data/app/helpers/ads_helper.rb +11 -12
  43. data/app/helpers/calendar_helper.rb +6 -2
  44. data/app/helpers/form_data_helper.rb +1 -1
  45. data/app/helpers/form_helper.rb +8 -0
  46. data/app/helpers/forum_helper.rb +5 -1
  47. data/app/helpers/kit_helper.rb +65 -35
  48. data/app/helpers/kit_modules_helper.rb +4 -0
  49. data/app/helpers/user_helper.rb +0 -28
  50. data/app/jobs/page_link_job.rb +34 -0
  51. data/app/jobs/queue_job.rb +134 -0
  52. data/app/mailers/notification.rb +10 -0
  53. data/app/mailers/queue_mailer.rb +13 -0
  54. data/app/models/ad.rb +6 -6
  55. data/app/models/ad_unit.rb +1 -1
  56. data/app/models/ad_zone.rb +4 -0
  57. data/app/models/block.rb +1 -1
  58. data/app/models/delayed_job.rb +3 -0
  59. data/app/models/form.rb +16 -4
  60. data/app/models/html_asset.rb +19 -4
  61. data/app/models/html_asset_usage.rb +3 -0
  62. data/app/models/html_assetable.rb +4 -0
  63. data/app/models/layout.rb +36 -6
  64. data/app/models/newsletter.rb +1 -1
  65. data/app/models/page.rb +36 -2
  66. data/app/models/page_link.rb +5 -0
  67. data/app/models/page_template.rb +22 -2
  68. data/app/models/preference.rb +1 -1
  69. data/app/models/q_event.rb +12 -0
  70. data/app/models/q_klass.rb +5 -0
  71. data/app/models/q_message.rb +9 -0
  72. data/app/models/q_publisher.rb +35 -0
  73. data/app/models/q_subscription.rb +7 -0
  74. data/app/models/q_user.rb +29 -0
  75. data/app/models/q_users_method.rb +6 -0
  76. data/app/models/q_users_publisher.rb +6 -0
  77. data/app/models/user.rb +127 -19
  78. data/app/models/user_login.rb +4 -0
  79. data/app/validators/email_validator.rb +14 -0
  80. data/app/views/account/_edit.html.haml +40 -0
  81. data/app/views/account/_edit_intro.html.haml +3 -0
  82. data/app/views/account/_forgotten.html.haml +20 -0
  83. data/app/views/account/_forgotten_intro.html.haml +5 -0
  84. data/app/views/account/_sign_in.html.haml +31 -0
  85. data/app/views/account/_sign_in_intro.html.haml +4 -0
  86. data/app/views/account/_sign_up.html.haml +51 -0
  87. data/app/views/account/_sign_up_intro.html.haml +4 -0
  88. data/app/views/account/edit.html.haml +1 -0
  89. data/app/views/account/forgotten.html.haml +1 -0
  90. data/app/views/account/sign_in.html.haml +2 -0
  91. data/app/views/account/sign_up.html.haml +1 -0
  92. data/app/views/ad/_buy.html.haml +2 -1
  93. data/app/views/admin/ad_zones/_form.html.haml +1 -1
  94. data/app/views/admin/ad_zones/show.html.haml +2 -0
  95. data/app/views/admin/blocks/_form.html.haml +11 -1
  96. data/app/views/admin/dashboard/broken_links.html.haml +9 -0
  97. data/app/views/admin/dashboard/system.html.haml +11 -0
  98. data/app/views/admin/dj/index.html.haml +43 -0
  99. data/app/views/admin/form/_form.html.haml +15 -10
  100. data/app/views/admin/group/index.html.haml +1 -1
  101. data/app/views/admin/help/edit.html.haml +1 -1
  102. data/app/views/admin/html_asset/show.html.haml +9 -2
  103. data/app/views/admin/layouts/show.html.haml +10 -16
  104. data/app/views/admin/page_templates/_form.html.haml +9 -17
  105. data/app/views/admin/page_templates/show.html.haml +5 -4
  106. data/app/views/admin/q/events.html.haml +26 -0
  107. data/app/views/admin/q/index.html.haml +28 -0
  108. data/app/views/admin/q/klasses.html.haml +61 -0
  109. data/app/views/admin/q/messages.html.haml +37 -0
  110. data/app/views/admin/q/show.html.haml +98 -0
  111. data/app/views/admin/q/subscriptions.html.haml +26 -0
  112. data/app/views/admin/q/users.html.haml +27 -0
  113. data/app/views/admin/snippet/edit.html.erb +1 -1
  114. data/app/views/admin/snippet/new.html.erb +1 -1
  115. data/app/views/admin/stylesheet/show.html.haml +1 -1
  116. data/app/views/admin/user/index.html.erb +15 -6
  117. data/app/views/admin/user/view.html.erb +5 -4
  118. data/app/views/admin/views/_form.html.haml +3 -3
  119. data/app/views/calendar/_buy_tickets.html.haml +1 -1
  120. data/app/views/calendar/_calendar_entry.html.haml +1 -1
  121. data/app/views/calendar/_month.html.haml +7 -7
  122. data/app/views/form/_show.html.haml +1 -1
  123. data/app/views/forum/_add_post.html.haml +7 -8
  124. data/app/views/forum/_mod_thread.js.erb +46 -6
  125. data/app/views/forum/_post_moderation.html.haml +2 -1
  126. data/app/views/forum/_post_preview.html.haml +1 -9
  127. data/app/views/forum/_post_scripts.js.erb +29 -5
  128. data/app/views/forum/fetch_raw.html.haml +1 -0
  129. data/app/views/forum/moderate.html.haml +1 -0
  130. data/app/views/forum/topic_index.html.haml +4 -0
  131. data/app/views/notification/{event.txt.erb → event.text.erb} +0 -0
  132. data/app/views/notification/forgotten_password.text.erb +2 -0
  133. data/app/views/pages/content_edit.html.haml +1 -1
  134. data/app/views/pages/info.html.erb +13 -2
  135. data/app/views/pages/links.html.haml +63 -0
  136. data/app/views/user/edit_profile.html.haml +1 -1
  137. data/app/views/utility/_cm_editor.html.erb +13 -10
  138. data/app/views/utility/_cm_toolbar_markdown.html.haml +8 -1
  139. data/app/views/utility/_menu.html.haml +4 -0
  140. data/app/views/utility/mercury_html.html.haml +1 -0
  141. data/config/initializers/elastic_search.rb +6 -3
  142. data/config/initializers/extend_controller.rb +3 -0
  143. data/config/initializers/string.rb +9 -6
  144. data/config/initializers/warden.rb +49 -0
  145. data/config/locales/en.yml +29 -1
  146. data/config/routes.rb +35 -2
  147. data/lib/kit_cms.rb +7 -2
  148. data/lib/tasks/kit.rake +90 -2
  149. metadata +139 -27
  150. data/app/controllers/user/confirmations_controller.rb +0 -11
  151. data/app/controllers/user/passwords_controller.rb +0 -13
  152. data/app/controllers/user/registrations_controller.rb +0 -110
  153. data/app/controllers/user/sessions_controller.rb +0 -33
  154. data/app/controllers/user/unlocks_controller.rb +0 -13
  155. data/app/views/devise/_links.erb +0 -25
  156. data/app/views/devise/confirmations/new.html.erb +0 -12
  157. data/app/views/devise/mailer/confirmation_instructions.html.erb +0 -5
  158. data/app/views/devise/mailer/reset_password_instructions.html.erb +0 -8
  159. data/app/views/devise/mailer/unlock_instructions.html.erb +0 -7
  160. data/app/views/devise/passwords/edit.html.erb +0 -16
  161. data/app/views/devise/passwords/new.html.erb +0 -12
  162. data/app/views/devise/registrations/edit.html.erb +0 -28
  163. data/app/views/devise/registrations/new.html.erb +0 -18
  164. data/app/views/devise/sessions/new.html.erb +0 -18
  165. data/app/views/devise/shared/_links.erb +0 -25
  166. data/app/views/devise/unlocks/new.html.erb +0 -12
  167. data/app/views/pages/links.html.erb +0 -8
  168. data/app/views/user/shared/_links.erb +0 -25
  169. data/config/initializers/devise.rb +0 -196
  170. data/config/initializers/devise_extender.rb +0 -39
@@ -19,7 +19,7 @@ module FormDataHelper
19
19
  lon = geo_loc[0].longitude
20
20
  end
21
21
 
22
- search = Tire.search "kit_#{app_name.downcase}_form_submissions" do
22
+ search = Tire.search "#{index_name}_form_submissions" do
23
23
  query do
24
24
  boolean do
25
25
  must do
@@ -1,5 +1,13 @@
1
1
  module FormHelper
2
2
 
3
+ def form_asset_selected(asset)
4
+ if @form && @form.id!=nil
5
+ @form.html_assets.include?(asset)
6
+ else
7
+ false
8
+ end
9
+ end
10
+
3
11
 
4
12
  def text_captcha_entry
5
13
  question, answers = Form.captcha_question(500)
@@ -1,5 +1,9 @@
1
1
  module ForumHelper
2
2
 
3
+ def use_markdown_editor
4
+ (sys_pref('use_markdown_editor')=='true' && !is_mobile?) ? 'true' : 'false'
5
+ end
6
+
3
7
  def forum_search(search_for, page, per, topic_ids = nil)
4
8
  # need to get list of topic_ids visible to this user (unless a topic_id is provided)
5
9
  # then do search, similar to forum_controller search
@@ -12,7 +16,7 @@ module ForumHelper
12
16
  color = 'green' if user.forum_status == -1
13
17
 
14
18
  ( "[" +
15
- link_to(user.email, "/admin/users/#{user.id}") +
19
+ link_to(user.email, "/admin/user/#{user.id}") +
16
20
  "] <span class='#{color}'>" +
17
21
  user.display_name +
18
22
  "</span> " +
@@ -52,15 +52,11 @@ module KitHelper
52
52
  request.fullpath.split("?")[0]
53
53
  end
54
54
 
55
- def kit_javascripts(additional = [])
55
+ def kit_javascripts
56
56
  op = []
57
- (additional + javascripts).each do |name|
58
- next if name.is_blank?
59
- js = HtmlAsset.fetch(_sid, name.downcase.strip, "js")
57
+ javascripts.each do |js|
60
58
  if js
61
- op << "<script type='text/javascript' src='/kit/js/#{js.kit_name.downcase}'></script>"
62
- else
63
- op << "<!-- javascript missing '#{name.downcase.strip}' -->"
59
+ op << "<script type='text/javascript' src='/kit/#{js.system_id}/js/#{js.kit_name.downcase}'></script>"
64
60
  end
65
61
  end
66
62
  op.join("\n").html_safe
@@ -68,19 +64,19 @@ module KitHelper
68
64
 
69
65
  def javascripts
70
66
  if @page
71
- (@page.page_template.layout.javascripts + "," + @page.page_template.javascripts).split(',').uniq rescue []
67
+ (@page.page_template.layout.javascripts + @page.page_template.javascripts).uniq rescue []
72
68
  else
73
69
  js = []
74
70
  layout_name = controller.layout_name_being_used rescue "application"
75
71
  if layout_name.not_blank?
76
72
  layout = Layout.sys(_sid).where(:name=>layout_name).first
77
73
  if layout
78
- js += layout.javascripts.split(',').uniq
74
+ js += layout.javascripts.uniq
79
75
  end
80
76
  end
81
77
  begin
82
78
  if controller.template_being_used
83
- js += controller.template_being_used.javascripts.split(',').uniq
79
+ js += controller.template_being_used.javascripts.uniq
84
80
  end
85
81
  rescue
86
82
  logger.debug "Javascripts error"
@@ -90,23 +86,13 @@ module KitHelper
90
86
  end
91
87
  end
92
88
 
93
- def kit_stylesheets(additional = [])
89
+ def kit_stylesheets
94
90
  op = []
95
- begin
96
- s = stylesheets
97
- rescue Exception => e
98
- s = ['application']
99
- logger.info "#{e.message}"
100
- end
101
- (additional + s).each do |name|
102
- next if name.is_blank?
103
- sheet = HtmlAsset.fetch(_sid, name.downcase.strip, "css")
91
+ stylesheets.each do |sheet|
104
92
  if sheet
105
- op << "<link rel='stylesheet' type='text/css' href='/kit/css/#{sheet.kit_name.downcase}'>"
106
- else
107
- op << "<!-- stylesheet missing '#{name.downcase.strip}' -->"
93
+ op << "<link rel='stylesheet' type='text/css' href='/kit/#{sheet.system_id}/css/#{sheet.kit_name.downcase}'>"
108
94
  end
109
- end
95
+ end
110
96
  op.join("\n").html_safe
111
97
  end
112
98
 
@@ -142,12 +128,23 @@ module KitHelper
142
128
  link_to_function label, "submit_form(this)", options
143
129
  end
144
130
 
145
- def cm_editor(mode, object, field, form, form_field = nil, options = {})
146
- form_field ||= "#{object}_#{field}"
147
-
148
- mode = 'htmlmixed' if mode == 'html'
149
- mode = 'css' if mode == 'sass' || mode == 'scss'
150
- render :partial=>'utility/cm_editor', :locals=>{:mode=>mode, :field=>field, :form_field=>form_field, :form=>form, :options=>options}
131
+ def cm_editor(name, options = {})
132
+ options[:mode] ||= "html"
133
+ options[:mode] = 'htmlmixed' if options[:mode] == 'html'
134
+ options[:mode] = 'css' if options[:mode] == 'sass' || options[:mode] == 'scss'
135
+
136
+ options[:id] ||= name.gsub('[','_').gsub(']','') + rand(100000000).to_s
137
+
138
+ logger.debug "*** #{name}"
139
+ if options[:value].is_blank? && name =~ /([^\[]+)\[([^\]]+)\]/
140
+ o = $1
141
+ f = $2
142
+ options[:value] = eval("@#{o}.#{f}") rescue ""
143
+ end
144
+
145
+ options[:value] ||= ''
146
+
147
+ render :partial=>'utility/cm_editor', :locals=>{:options=>options, :name=>name}
151
148
  end
152
149
 
153
150
  def hide_if(bool)
@@ -360,7 +357,7 @@ module KitHelper
360
357
  end
361
358
 
362
359
  def pref(name, system = false, default = nil)
363
- return nil unless current_user || system
360
+ return nil unless system || current_user
364
361
  p = Preference.getCached(_sid, name, system ? nil : current_user.id)
365
362
  return p ? p : default
366
363
  end
@@ -465,17 +462,50 @@ module KitHelper
465
462
  date.strftime(Preference.getCached(_sid, 'date_time_format') || '%d-%b-%y %H:%M')
466
463
  end
467
464
 
468
- def obscure_email(email)
469
- return nil if email.nil? #Don't bother if the parameter is nil.
470
- lower = ('a'..'z').to_a
465
+ def entity_encode(s)
466
+ lower = ('a'..'z').to_a
471
467
  upper = ('A'..'Z').to_a
472
- email.split('').map { |char|
468
+ s.split('').map { |char|
473
469
  output = lower.index(char) + 97 if lower.include?(char)
474
470
  output = upper.index(char) + 65 if upper.include?(char)
475
471
  output ? "&##{output};" : (char == '@' ? '&#0064;' : char)
476
472
  }.join
473
+ end
474
+
475
+ def obscure_email(email)
476
+ return nil if email.nil? #Don't bother if the parameter is nil.
477
+ op = []
478
+
479
+ m = rand(4)+1
480
+ for i in 0..email.length-1
481
+ if (i % m)==0
482
+ random_class = "c#{rand(1000000)}"
483
+ op << "<style type='text/css'>span.#{random_class} { display: none; }</style>"
484
+ op << "<span class='#{random_class}'>"
485
+ for x in 0..rand(5)
486
+ op << (97+rand(25)).chr
487
+ end
488
+ op << "</span>"
489
+ end
490
+ op << entity_encode(email[i])
491
+ end
492
+
493
+ op.join('').html_safe
477
494
  end
478
495
 
496
+ def ip_info_link(ip)
497
+ link_to ip, "http://www.infobyip.com/ip-#{ip}.html"
498
+ end
499
+
500
+ def is_mobile?
501
+ if @is_mobile==nil
502
+ browser = Browser.new(:ua=>request.env['HTTP_USER_AGENT'])
503
+ @is_mobile = browser.mobile?
504
+ end
505
+
506
+ return @is_mobile
507
+ end
508
+
479
509
  end
480
510
 
481
511
 
@@ -1,5 +1,9 @@
1
1
  module KitModulesHelper
2
2
 
3
+ def kit_signin_form(options = {})
4
+ account_sign_in_form(options)
5
+ end
6
+
3
7
  def kit_page_list(options={})
4
8
  # category, template_snippet, limit = 5, order_by = "updated_at desc")
5
9
  pages = Page.sys(_sid)
@@ -1,33 +1,5 @@
1
1
  module UserHelper
2
2
 
3
- def devise_error_messages!
4
- flash_alerts = []
5
- error_key = 'errors.messages.not_saved'
6
-
7
- if !flash.empty?
8
- flash_alerts.push(flash[:error]) if flash[:error]
9
- flash_alerts.push(flash[:alert]) if flash[:alert]
10
- flash_alerts.push(flash[:notice]) if flash[:notice]
11
- error_key = 'devise.failure.invalid'
12
- end
13
-
14
- return "" if resource.errors.empty? && flash_alerts.empty?
15
- errors = resource.errors.empty? ? flash_alerts : resource.errors.full_messages
16
-
17
- messages = errors.map { |msg| content_tag(:li, msg) }.join
18
- sentence = I18n.t(error_key, :count => errors.count,
19
- :resource => resource.class.model_name.human.downcase)
20
-
21
- html = <<-HTML
22
- <div id="error_explanation">
23
- <h2>#{sentence}</h2>
24
- <ul>#{messages}</ul>
25
- </div>
26
- HTML
27
-
28
- html.html_safe
29
- end
30
-
31
3
  def field_types
32
4
  FormFieldType.sys(_sid).where(:hidden=>0).order(:name).all
33
5
  end
@@ -0,0 +1,34 @@
1
+ class PageLinkJob < Struct.new(:system_id)
2
+
3
+ def perform
4
+ last_crawl = (Time.zone.parse(Preference.get(system_id, "last_crawl")) rescue nil)
5
+ this_crawl = Time.now
6
+ Preference.set(system_id, "last_crawl", this_crawl)
7
+ Rails.logger.debug "Last crawl #{last_crawl} This Crawl #{this_crawl}"
8
+ pages = Page
9
+ pages = pages.sys(system_id) unless system_id == 0
10
+ pages = pages.where(["needs_crawl > ?", last_crawl]) if last_crawl
11
+ pages = pages.where(["needs_crawl <= ?", this_crawl])
12
+ pages.where("needs_crawl is not null").find_each do |p|
13
+ Rails.logger.debug "Crawling page #{p.id}"
14
+ p.crawl
15
+ end
16
+ end
17
+
18
+ def error(job, e)
19
+ Preference.set(system_id, "last_crawl", nil)
20
+ notes = []
21
+ notes << "Exception Message: #{e.message}"
22
+ notes << "Stack Trace: #{e.backtrace.join("\n")}"
23
+ reference = Digest::MD5.hexdigest(Time.now.to_s)[0..8]
24
+ Event.store("PageLinkJob error", nil, 0, notes.join("\n"), reference)
25
+ Activity.add(system_id, "Page Link refresh Failed #{reference}", 0, "System", '')
26
+ Rails.logger.error "PageLinkJob error: #{reference} #{e.message}"
27
+ end
28
+
29
+ def success(job)
30
+ Activity.add(system_id, "Page Links refreshed", 0, "System", '')
31
+ end
32
+
33
+ end
34
+
@@ -0,0 +1,134 @@
1
+ require 'twitter'
2
+
3
+ class QueueJob < Struct.new(:event_id)
4
+
5
+ class Message
6
+ attr_accessor :body, :h1, :h2
7
+ end
8
+
9
+ def perform
10
+
11
+ @event = QEvent.find(event_id)
12
+ return if @event.processed_at
13
+
14
+ messages = {} # keyed on klass, i.e. the database record which shows how to generate the message body
15
+
16
+ twitter = Twitter::publisher.new(
17
+ :consumer_key => @event.q_publisher.twitter_consumer_key,
18
+ :consumer_secret => @event.q_publisher.twitter_consumer_secret,
19
+ :oauth_token => @event.q_publisher.twitter_oauth_token,
20
+ :oauth_token_secret => @event.q_publisher.twitter_oauth_token_secret
21
+ ) rescue nil
22
+
23
+ ios = Grocer.pusher(
24
+ certificate: StringIO.new(@event.q_publisher.ios_certificate),
25
+ port: 2195,
26
+ retries: 3
27
+ ) rescue nil
28
+
29
+ QSubscription.sys(@event.system_id).where(:q_publisher_id=>@event.q_publisher_id).where(:topic=>@event.topic).includes(:q_user).find_each do |sub|
30
+
31
+ sub.q_user.q_users_methods.each do |method|
32
+ msg = messages[method]
33
+ unless msg
34
+ klass = QKlass.sys(@event.system_id).where(:q_publisher_id=>@event.q_publisher_id).where(:name=>@event.klass).first
35
+ if klass
36
+ body = eval(klass.message_code)
37
+ h1 = eval(klass.h1_code)
38
+ h2 = eval(klass.h2_code)
39
+ else
40
+ body = @event.data
41
+ h1 = ""
42
+ h2 = ""
43
+ end
44
+ msg = Message.new
45
+ msg.body = body
46
+ msg.h1 = h1
47
+ msg.h2 = h2
48
+ messages[method] = msg
49
+ end
50
+
51
+ message = QMessage.new(:q_publisher=>@event.q_publisher, :q_event=>@event, :q_subscription=>sub, :q_user=>sub.q_user, :body=>msg.body, :h1=>msg.h1, :h2=>msg.h2, :system_id=>@event.system_id)
52
+
53
+ next unless msg.body.not_blank?
54
+ begin
55
+ if method=='twitter'
56
+ do_twitter(sub, message, msg, twitter)
57
+ elsif method=='email'
58
+ do_email(sub, message, msg)
59
+ elsif method=='ios'
60
+ do_ios(sub, message, msg, ios)
61
+ elsif method=='web'
62
+ do_web(sub, message, msg)
63
+ end
64
+ rescue Exception => e
65
+ message.status = e.message
66
+ end
67
+ message.save
68
+ end
69
+
70
+ sub.last_notification = Time.now
71
+ sub.save
72
+ end
73
+
74
+ @event.processed_at = Time.now
75
+ @event.save
76
+ end
77
+
78
+ def do_twitter(sub, message, twitter, msg)
79
+
80
+ unless twitter
81
+ message.status = 'Twitter not configured'
82
+ return
83
+ end
84
+
85
+ if sub.q_user.source==1
86
+ twitter.update(msg.body) # tweet
87
+ message.destination = "tweet"
88
+ else
89
+ return unless sub.q_user.twitter_handle.not_blank?
90
+ twitter.direct_message_create(sub.q_user.twitter_handle, msg.body) # direct message
91
+ message.destination = "@#{sub.q_user.twitter_handle}"
92
+ end
93
+ message.status = "OK"
94
+ end
95
+
96
+ def do_email(sub, message, msg)
97
+ message.destination = sub.q_user.email
98
+ QueueMailer.delay.notification(message.id, sub.q_user.email, sub.q_publisher.mail_from, msg.h1, msg.body)
99
+ message.status = "PENDING"
100
+ end
101
+
102
+ def do_ios(sub, message, msg, ios)
103
+ notification = Grocer::Notification.new(
104
+ device_token: sub.q_user.ios_device_token,
105
+ alert: msg.body,
106
+ sound: "siren.aiff",
107
+ expiry: Time.now + 60*60,
108
+ )
109
+
110
+ ios.push(notification)
111
+ message.destination = "iOS"
112
+ message.status = "OK"
113
+ end
114
+
115
+ def do_web(sub, sent, msg)
116
+ message.status = "PENDING"
117
+ # do nothing - let the web api offer up the messages
118
+ end
119
+
120
+ def error(job, e)
121
+ notes = []
122
+ notes << "Exception Message: #{e.message}"
123
+ notes << "Stack Trace: #{e.backtrace.join("\n")}"
124
+ reference = Digest::MD5.hexdigest(Time.now.to_s)[0..8]
125
+ Event.store("QueueJob error", nil, 0, notes.join("\n"), reference)
126
+ Rails.logger.error "QueueJob error: #{reference} #{e.message}"
127
+ end
128
+
129
+ def success(job)
130
+ end
131
+
132
+ end
133
+
134
+
@@ -20,6 +20,16 @@ class Notification < ActionMailer::Base
20
20
  mail :subject=>"#{Preference.get_cached(@sid, "site_name")}: New post on thread '#{truncate(post.topic_thread.title, :length=>80, :ommission=>'...')}'", :to=>@to_user.email, :from=>isfrom(@sid)
21
21
  end
22
22
 
23
+ def forgotten_password(to_user_id)
24
+ @user = User.find(to_user_id)
25
+ reset_url = Preference.get_cached(@user.system_id, "account_reset_url") || "/users/reset"
26
+
27
+ @reset_link = Preference.get_cached(@user.system_id, "host") + reset_url + "/" + @user.reset_password_token
28
+ mail :subject=>t("account.forgotten_password_subject"),
29
+ :to=>@user.email,
30
+ :from=>isfrom(@user.system_id)
31
+ end
32
+
23
33
  def welcome_message(to, sid)
24
34
  @sid = sid
25
35
  mail(:from=>isfrom(sid), :to=>to.email, :subject=>"Thanks for joining")
@@ -0,0 +1,13 @@
1
+ include ActionView::Helpers::TextHelper
2
+
3
+ class QueueMailer < ActionMailer::Base
4
+
5
+ def notification(sent_id, to, from, subject, body)
6
+ qs = QSent.find(sent_id)
7
+ qs.status = "OK"
8
+ qs.save
9
+
10
+ mail(:from=>from, :to => to, :subject => subject, :body=>body)
11
+ end
12
+ end
13
+