kit_cms 2.3.20 → 2.3.22

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.
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
+