kublog 0.0.1.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. data/.gitignore +4 -5
  2. data/.rspec +2 -0
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +89 -77
  5. data/README.rdoc +102 -61
  6. data/Rakefile +5 -10
  7. data/app/assets/javascripts/kublog/email.js.coffee +24 -9
  8. data/app/assets/javascripts/kublog/posts.js.coffee +46 -19
  9. data/app/assets/javascripts/kublog/shared.js.coffee.erb +1 -1
  10. data/app/assets/javascripts/kublog/wysiwyg.controls.js.coffee +0 -1
  11. data/app/assets/plugins/kublog/ajaxyupload/javascripts/jquery.ajaxyupload.js +1 -1
  12. data/app/assets/stylesheets/kublog/posts.css +2 -2
  13. data/app/controllers/kublog/application_controller.rb +18 -2
  14. data/app/controllers/kublog/categories_controller.rb +2 -2
  15. data/app/controllers/kublog/notifications_controller.rb +13 -0
  16. data/app/controllers/kublog/posts_controller.rb +7 -18
  17. data/app/helpers/kublog/application_helper.rb +15 -0
  18. data/app/helpers/kublog/notifications_helper.rb +4 -0
  19. data/app/helpers/kublog/posts_helper.rb +4 -0
  20. data/app/jobs/kublog/deliver_comment.rb +14 -0
  21. data/app/mailers/kublog/comment_mailer.rb +11 -0
  22. data/app/mailers/kublog/post_mailer.rb +4 -5
  23. data/app/models/kublog/category.rb +13 -5
  24. data/app/models/kublog/comment.rb +17 -6
  25. data/app/models/kublog/notification.rb +27 -0
  26. data/app/models/kublog/post.rb +11 -6
  27. data/app/presenters/kublog/post_form_presenter.rb +19 -0
  28. data/app/presenters/kublog/posts_presenter.rb +7 -1
  29. data/app/uploaders/kublog/file_uploader.rb +0 -3
  30. data/app/views/kublog/comment_mailer/new_comment.html.erb +11 -0
  31. data/app/views/kublog/post_mailer/new_post.html.erb +1 -1
  32. data/app/views/kublog/post_mailer/new_post.liquid.html.erb +9 -1
  33. data/app/views/kublog/posts/_email_form.html.erb +27 -9
  34. data/app/views/kublog/posts/_facebook_form.html.erb +10 -0
  35. data/app/views/kublog/posts/_form.html.erb +7 -45
  36. data/app/views/kublog/posts/_twitter_form.html.erb +11 -0
  37. data/app/views/kublog/posts/edit.html.erb +1 -1
  38. data/app/views/kublog/posts/index.atom.builder +1 -2
  39. data/app/views/kublog/posts/index.rss.builder +20 -0
  40. data/app/views/kublog/posts/new.html.erb +1 -1
  41. data/config/locales/kublog/en.yml +9 -0
  42. data/config/routes.rb +8 -0
  43. data/db/migrate/20110816211552_create_kublog_posts.rb +1 -9
  44. data/db/migrate/20110901205127_create_kublog_notifications.rb +18 -0
  45. data/index.html +10 -0
  46. data/kublog.gemspec +10 -10
  47. data/lib/generators/kublog/install/USAGE +8 -0
  48. data/lib/generators/kublog/install/install_generator.rb +78 -0
  49. data/lib/generators/kublog/install/templates/configuration.rb.tt +45 -0
  50. data/lib/kublog.rb +43 -13
  51. data/lib/kublog/author.rb +2 -3
  52. data/lib/kublog/engine.rb +1 -0
  53. data/lib/kublog/network/email.rb +113 -0
  54. data/lib/kublog/network/facebook.rb +54 -0
  55. data/lib/kublog/network/twitter.rb +55 -0
  56. data/lib/kublog/notifiable.rb +2 -5
  57. data/lib/kublog/processor.rb +27 -0
  58. data/lib/kublog/version.rb +2 -2
  59. data/script/rails +1 -1
  60. data/{test → spec}/dummy/Rakefile +0 -0
  61. data/{test → spec}/dummy/app/assets/javascripts/application.js +0 -0
  62. data/{test → spec}/dummy/app/assets/javascripts/sessions.js +0 -0
  63. data/{test → spec}/dummy/app/assets/javascripts/users.js +0 -0
  64. data/{test → spec}/dummy/app/assets/stylesheets/application.css +0 -0
  65. data/{test → spec}/dummy/app/assets/stylesheets/sessions.css +0 -0
  66. data/{test → spec}/dummy/app/assets/stylesheets/users.css +0 -0
  67. data/{test → spec}/dummy/app/controllers/application_controller.rb +0 -0
  68. data/{test → spec}/dummy/app/controllers/sessions_controller.rb +0 -0
  69. data/{test → spec}/dummy/app/controllers/users_controller.rb +0 -0
  70. data/{test → spec}/dummy/app/helpers/application_helper.rb +0 -0
  71. data/{test → spec}/dummy/app/helpers/error_messages_helper.rb +0 -0
  72. data/{test → spec}/dummy/app/helpers/layout_helper.rb +0 -0
  73. data/{test → spec}/dummy/app/helpers/sessions_helper.rb +0 -0
  74. data/{test → spec}/dummy/app/helpers/users_helper.rb +0 -0
  75. data/{test → spec}/dummy/app/mailers/.gitkeep +0 -0
  76. data/{test → spec}/dummy/app/models/.gitkeep +0 -0
  77. data/{test → spec}/dummy/app/models/ability.rb +0 -0
  78. data/{test → spec}/dummy/app/models/user.rb +1 -5
  79. data/{test → spec}/dummy/app/views/layouts/_account.html.erb +0 -0
  80. data/{test → spec}/dummy/app/views/layouts/application.html.erb +0 -0
  81. data/{test → spec}/dummy/app/views/layouts/kublog/application.html.erb +0 -0
  82. data/{test → spec}/dummy/app/views/sessions/new.html.erb +0 -0
  83. data/{test → spec}/dummy/app/views/users/new.html.erb +0 -0
  84. data/{test → spec}/dummy/config.ru +0 -0
  85. data/{test → spec}/dummy/config/application.rb +0 -0
  86. data/{test → spec}/dummy/config/boot.rb +0 -0
  87. data/{test → spec}/dummy/config/database.yml +0 -0
  88. data/{test → spec}/dummy/config/environment.rb +0 -0
  89. data/{test → spec}/dummy/config/environments/development.rb +0 -0
  90. data/{test → spec}/dummy/config/environments/production.rb +0 -0
  91. data/{test → spec}/dummy/config/environments/test.rb +0 -0
  92. data/{test → spec}/dummy/config/initializers/backtrace_silencers.rb +0 -0
  93. data/{test → spec}/dummy/config/initializers/inflections.rb +0 -0
  94. data/spec/dummy/config/initializers/kublog.rb +34 -0
  95. data/{test → spec}/dummy/config/initializers/mime_types.rb +0 -0
  96. data/{test → spec}/dummy/config/initializers/secret_token.rb +0 -0
  97. data/{test → spec}/dummy/config/initializers/session_store.rb +0 -0
  98. data/{test → spec}/dummy/config/initializers/wrap_parameters.rb +0 -0
  99. data/{test → spec}/dummy/config/locales/en.yml +9 -0
  100. data/{test → spec}/dummy/config/routes.rb +0 -0
  101. data/{test → spec}/dummy/db/migrate/20110816225222_create_users.rb +1 -0
  102. data/{test → spec}/dummy/db/migrate/20110819135547_create_delayed_jobs.rb +0 -0
  103. data/{test → spec}/dummy/db/schema.rb +16 -10
  104. data/{test → spec}/dummy/lib/assets/.gitkeep +0 -0
  105. data/{test → spec}/dummy/log/.gitkeep +0 -0
  106. data/{test → spec}/dummy/public/404.html +0 -0
  107. data/{test → spec}/dummy/public/422.html +0 -0
  108. data/{test → spec}/dummy/public/500.html +0 -0
  109. data/{test → spec}/dummy/public/favicon.ico +0 -0
  110. data/{test → spec}/dummy/script/delayed_job +0 -0
  111. data/{test → spec}/dummy/script/rails +0 -0
  112. data/spec/factories.rb +54 -0
  113. data/spec/fixtures/Adrian.png +0 -0
  114. data/spec/fixtures/rendered_email.html +15 -0
  115. data/spec/lib/author_spec.rb +25 -0
  116. data/spec/lib/network/email_spec.rb +113 -0
  117. data/spec/lib/network/facebook_spec.rb +68 -0
  118. data/spec/lib/network/twitter_spec.rb +68 -0
  119. data/spec/lib/notifiable_spec.rb +23 -0
  120. data/spec/lib/processor_spec.rb +25 -0
  121. data/spec/models/kublog/category_spec.rb +43 -0
  122. data/spec/models/kublog/comment_spec.rb +56 -0
  123. data/spec/models/kublog/image_spec.rb +37 -0
  124. data/spec/models/kublog/notification_spec.rb +53 -0
  125. data/spec/models/kublog/post_spec.rb +63 -0
  126. data/spec/spec_helper.rb +43 -0
  127. metadata +198 -208
  128. data/app/assets/stylesheets/kublog/categories.css +0 -4
  129. data/app/assets/stylesheets/kublog/comments.css +0 -4
  130. data/lib/kublog/notification/email.rb +0 -86
  131. data/lib/kublog/notification/email_job.rb +0 -14
  132. data/lib/kublog/notification/fb_post.rb +0 -43
  133. data/lib/kublog/notification/fb_post_job.rb +0 -16
  134. data/lib/kublog/notification/tweet.rb +0 -68
  135. data/lib/kublog/notification/tweet_job.rb +0 -16
  136. data/test/dummy/test/fixtures/users.yml +0 -9
  137. data/test/dummy/test/functional/sessions_controller_test.rb +0 -7
  138. data/test/dummy/test/functional/users_controller_test.rb +0 -7
  139. data/test/dummy/test/unit/helpers/sessions_helper_test.rb +0 -4
  140. data/test/dummy/test/unit/helpers/users_helper_test.rb +0 -4
  141. data/test/dummy/test/unit/user_test.rb +0 -7
  142. data/test/factories.rb +0 -9
  143. data/test/fixtures/kublog/categories.yml +0 -7
  144. data/test/fixtures/kublog/comments.yml +0 -7
  145. data/test/fixtures/kublog/images.yml +0 -9
  146. data/test/fixtures/kublog/posts.yml +0 -9
  147. data/test/functional/kublog/categories_controller_test.rb +0 -9
  148. data/test/functional/kublog/comments_controller_test.rb +0 -9
  149. data/test/functional/kublog/images_controller_test.rb +0 -9
  150. data/test/functional/kublog/post_mailer_test.rb +0 -9
  151. data/test/functional/kublog/posts_controller_test.rb +0 -9
  152. data/test/integration/navigation_test.rb +0 -10
  153. data/test/kublog_test.rb +0 -7
  154. data/test/test_helper.rb +0 -12
  155. data/test/unit/helpers/kublog/categories_helper_test.rb +0 -6
  156. data/test/unit/helpers/kublog/comments_helper_test.rb +0 -6
  157. data/test/unit/helpers/kublog/images_helper_test.rb +0 -6
  158. data/test/unit/helpers/kublog/posts_helper_test.rb +0 -6
  159. data/test/unit/kublog/category_test.rb +0 -9
  160. data/test/unit/kublog/comment_test.rb +0 -9
  161. data/test/unit/kublog/image_test.rb +0 -9
  162. data/test/unit/kublog/post_test.rb +0 -19
data/Rakefile CHANGED
@@ -20,20 +20,15 @@ RDoc::Task.new(:rdoc) do |rdoc|
20
20
  rdoc.rdoc_files.include('lib/**/*.rb')
21
21
  end
22
22
 
23
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
24
  load 'rails/tasks/engine.rake'
25
25
 
26
26
 
27
27
  Bundler::GemHelper.install_tasks
28
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
29
+ require 'rspec/core/rake_task'
37
30
 
31
+ RSpec::Core::RakeTask.new('spec')
38
32
 
39
- task :default => :test
33
+ # If you want to make this the default task
34
+ task :default => :spec
@@ -1,22 +1,37 @@
1
1
  $(document).ready ->
2
2
 
3
+ ### Special Optional fields are not shown on check, but only enabled ###
4
+ $('#kublog .email_checkbox').change ->
5
+ $optional = $(this).siblings('.optional')
6
+ $optional_lightbox = $(this).siblings('.optional_lightbox')
7
+ if $(this).attr('checked')?
8
+ $optional.show().find('[disabled]').attr('disabled', false)
9
+ $optional.find('input[type=checkbox]').attr('checked',true)
10
+ $optional_lightbox.find('[disabled]').attr('disabled', false)
11
+ else
12
+ $optional.find('input[type=checkbox]').attr('checked',false)
13
+ $optional.hide().find('textarea, input').attr('disabled', true)
14
+ $optional_lightbox.find('textarea, input').attr('disabled', true)
15
+
3
16
  ## Notification Preview
4
17
  $('#kublog .submit_fancybox').fancybox
5
18
  showCloseButton: false
6
19
  hideOnOverlayClick: false
7
20
  onComplete: ->
8
- textarea_html = $('#post_email_body').parent().html()
9
- $('#post_email_body').data('prewysiwyg', textarea_html)
10
- $('#post_email_body').wysiwyg(wysiwyg.email_controls)
21
+ textarea_html = $('.email_content').parent().html()
22
+ $('.email_content').data('prewysiwyg', textarea_html)
23
+ $('.email_content').wysiwyg(wysiwyg.email_controls)
11
24
  onClosed: ->
12
- $('form.post_form').submit() if $('#post_email_body').data('ready')?
13
- textarea_html = $('#post_email_body').data('prewysiwyg')
14
- $('#post_email_body').parent().html(textarea_html)
25
+ $('form.post_form').submit() if $('.email_content').data('ready')?
26
+ textarea_html = $('.email_content').data('prewysiwyg')
27
+ $('.email_content').parent().html(textarea_html)
15
28
 
16
29
  ## Calls Lightbox if User still decides to notify via E-mail
17
30
  $('#kublog .post_form').submit ->
18
- if $('#post_email_notify').attr('checked')? && not $('#post_email_body').data('ready')
19
- $('#post_email_body').val($(this).data('post').email_body)
31
+ $email_checkbox = $('.email_checkbox')
32
+ $email_content = $('.email_content')
33
+ if $email_checkbox.attr('checked')? && not $email_content.data('ready')
34
+ $email_content.val($(this).data('post'))
20
35
  $('#link-to-email-template').click()
21
36
  return false
22
37
  else
@@ -24,7 +39,7 @@ $(document).ready ->
24
39
 
25
40
  ## Confirms Notification text and readies for submission
26
41
  $('#kublog #email_submit').click ->
27
- $('#post_email_body').data('ready', true)
42
+ $('.email_content').data('ready', true)
28
43
  $.fancybox.close()
29
44
 
30
45
  ## Aborts notification Submission
@@ -1,15 +1,41 @@
1
- $(document).ready ->
1
+ ## Starts to make js object-oriented
2
+ class KublogPost
3
+ constructor: ->
4
+ @title = $('#post_title')
5
+ @body = $('#post_body')
6
+
7
+ validateTitle: ->
8
+ return if @title.val() isnt ""
9
+ @addError('title',"can't be blank")
10
+
11
+ validateBody: ->
12
+ return if $(@body.val()).text().trim() isnt ""
13
+ @addError('body',"can't be blank")
2
14
 
3
- ## Editor for Post Body
15
+ validate: ->
16
+ @errors = undefined
17
+ @validateTitle()
18
+ @validateBody()
19
+ @errors is undefined
20
+
21
+ addError: (attr, error)->
22
+ @errors ?= {}
23
+ @errors[attr] = [error]
24
+
25
+ window.KublogPost = KublogPost
26
+
27
+ $(document).ready ->
28
+ # Jquery Wysiwyg editor with default configuration
4
29
  $('#kublog .editor').wysiwyg(wysiwyg.default_controls)
5
30
 
6
- ### Twitter Char Counter Event ###
31
+ # Counts twitter chars as a limit of 139
32
+ # limit is given to include a shortened version of the link to post
7
33
  $('#kublog textarea[maxlength]').keyup(charCounter).keyup()
8
34
 
9
- ### Twitter and Facebook Post Cloning Event ###
35
+ # Clones title content into twitter and facebook messages
10
36
  $('#kublog .original').keyup(mimicTitle).keyup()
11
37
 
12
- ### Optional Hidden Fields (Currently E-mail notifications, Twitter and Facebook) ###
38
+ # Server optional Hidden Fields (Currently Twitter and Facebook)
13
39
  $('#kublog .trigger-optional').change ->
14
40
  $optional = $(this).siblings('.optional')
15
41
  if $(this).attr('checked')?
@@ -17,22 +43,23 @@ $(document).ready ->
17
43
  else
18
44
  $optional.hide().find('textarea, input').attr('disabled', true)
19
45
 
20
- ### Validates the form through AJAX on server Side ###
21
- # check doesn't care if editing or creating new post
46
+ # Gets the E-mail preview of the post
47
+ # ready for editing using a liquid template
22
48
  $('#kublog #create_post_button').click ->
23
- resetErrors()
24
- post_data = $(this).closest('form').first().serialize()
25
- $.post "#{kublogPath}posts/check.json", post_data, (data) ->
26
- $form = $('#kublog .post_form')
27
- $form.data('post', data)
28
- $form.submit()
29
- return true
30
- .error (response)->
31
- errors = JSON.parse(response.responseText)
32
- setErrors('post', errors)
49
+ post = new KublogPost()
50
+ window.resetErrors()
51
+ if post.validate()
52
+ getEmailPreview()
53
+ else
54
+ window.setErrors('post', post.errors)
33
55
  return false
34
-
35
- # Handle on Event
56
+
57
+ getEmailPreview = ->
58
+ post = { post: {title: $('#post_title').val(), body: $('#post_body').val() } }
59
+ $.post "#{kublogPath}notifications/preview.json", post, (data) ->
60
+ $form = $('#kublog .post_form')
61
+ $form.data('post', data.preview)
62
+ $form.submit()
36
63
 
37
64
  charCounter = ->
38
65
  $chars_left_display = $(this).siblings('.chars_left')
@@ -2,7 +2,7 @@
2
2
  window.setErrors = (model, errors) ->
3
3
  for attribute, error of errors
4
4
  $label = $("label[for=#{model}_#{attribute}]")
5
- $field = $("##{model}_#{attribute}}")
5
+ $field = $("##{model}_#{attribute}")
6
6
  unless $label.size() is 0
7
7
  $label.addClass('error')
8
8
  $(errorTemplate(error[0])).insertAfter($label)
@@ -1,5 +1,4 @@
1
1
  window.wysiwyg = { }
2
-
3
2
  window.wysiwyg.default_controls =
4
3
  controls:
5
4
  bold : { visible : true }
@@ -76,7 +76,7 @@
76
76
  contentType : "application/octet-stream",
77
77
  dataType : "json",
78
78
  processData : false,
79
- data : file,
79
+ data : file
80
80
  });
81
81
  });
82
82
  });
@@ -3,8 +3,8 @@
3
3
  They will automatically be included in application.css.
4
4
  */
5
5
 
6
- #kublog textarea#post_body{
7
- width:550px;
6
+ #kublog textarea#post_body, #kublog textarea.email_content{
7
+ width:500px;
8
8
  }
9
9
 
10
10
  #kublog div.optional{
@@ -1,12 +1,28 @@
1
1
  module Kublog
2
2
  class ApplicationController < ActionController::Base
3
- include UserIntegration::Common
4
-
5
3
  before_filter :require_admin
6
4
 
5
+ helper_method :is_admin?
6
+ helper_method :current_user #TODO: Delete me if you're using Devise
7
+
7
8
  def require_admin
8
9
  redirect_to root_path unless is_admin?
9
10
  end
10
11
 
12
+ ## TODO: Fill in this method
13
+ ## This method should return the logged in user or nil
14
+ ## Define this whether or not you have it on your application controller
15
+ ## Apps using Devise can skip this
16
+ def current_user
17
+
18
+ end
19
+
20
+ ## TODO: Fill in this method
21
+ ## Returns if the current user has admin privileges for the blog
22
+ ## Define this whether or not you have the method on your application controller
23
+ def is_admin?
24
+
25
+ end
26
+
11
27
  end
12
28
  end
@@ -7,8 +7,8 @@ module Kublog
7
7
  @category = Category.find(params[:id])
8
8
  @presenter = PostsPresenter.new(@category)
9
9
  respond_to do |format|
10
- format.atom { render "/kublog/posts/index", :layout => false }
11
- format.rss { redirect_to category_path(@category, :format => :atom), :status => :moved_permanently }
10
+ format.atom { render "/kublog/posts/index", :layout => false, :content_type => 'text/xml' }
11
+ format.rss { render "/kublog/posts/index", :layout => false, :content_type => 'text/xml' }
12
12
  format.html { render "/kublog/posts/index" }
13
13
  end
14
14
  end
@@ -0,0 +1,13 @@
1
+ module Kublog
2
+ class NotificationsController < ApplicationController
3
+
4
+ def preview
5
+ @post = Post.new(params[:post])
6
+ @preview = Notification.email_template(@post)
7
+ respond_to do |format|
8
+ format.json { render :json => {:preview => @preview }}
9
+ end
10
+ end
11
+
12
+ end
13
+ end
@@ -1,19 +1,19 @@
1
1
  module Kublog
2
2
  class PostsController < ApplicationController
3
3
 
4
- skip_filter :require_admin, :only => [:index, :show]
4
+ skip_filter :require_admin, :only => [:index, :show]
5
5
 
6
6
  def index
7
7
  @presenter = PostsPresenter.new
8
8
  respond_to do |format|
9
- format.atom { render :layout => false }
10
- format.rss { redirect_to posts_path(:format => :atom), :status => :moved_permanently }
11
9
  format.html { }
10
+ format.atom { render :layout => false, :content_type => 'text/xml' }
11
+ format.rss { render :layout => false, :content_type => 'text/xml' }
12
12
  end
13
13
  end
14
14
 
15
15
  def new
16
- @post = Post.new
16
+ @presenter = PostFormPresenter.new(Post.new)
17
17
  end
18
18
 
19
19
  def show
@@ -21,18 +21,18 @@ module Kublog
21
21
  @presenter = PostPresenter.new(post)
22
22
  end
23
23
 
24
- #TODO: Figure out a proxy method to access User
25
24
  def create
26
25
  @post = current_user.posts.build(params[:post])
27
26
  if @post.save
28
27
  redirect_to @post
29
28
  else
29
+ @presenter = PostFormPresenter.new(@post)
30
30
  render 'new'
31
31
  end
32
32
  end
33
33
 
34
34
  def edit
35
- @post = Post.find(params[:id])
35
+ @presenter = PostFormPresenter.new(Post.find(params[:id]))
36
36
  end
37
37
 
38
38
  def update
@@ -40,6 +40,7 @@ module Kublog
40
40
  if @post.update_attributes(params[:post])
41
41
  redirect_to @post
42
42
  else
43
+ @presenter = PostFormPresenter.new(@post)
43
44
  render 'edit'
44
45
  end
45
46
  end
@@ -50,17 +51,5 @@ module Kublog
50
51
  redirect_to posts_path
51
52
  end
52
53
 
53
- def check
54
- @post = current_user.posts.build(params[:post])
55
- respond_to do |format|
56
- if @post.valid?
57
- format.json { render :json => @post }
58
- else
59
- format.json { render :json => @post.errors.messages, :status => :unprocessable_entity }
60
- end
61
- end
62
-
63
- end
64
-
65
54
  end
66
55
  end
@@ -1,4 +1,19 @@
1
1
  module Kublog
2
2
  module ApplicationHelper
3
+
4
+ ## Nifty generators errors helper code
5
+ def error_messages_for(*objects)
6
+ options = objects.extract_options!
7
+ options[:header_message] ||= I18n.t(:"activerecord.errors.header", :default => "Invalid Fields")
8
+ options[:message] ||= I18n.t(:"activerecord.errors.message", :default => "Correct the following errors and try again.")
9
+ messages = objects.compact.map { |o| o.errors.full_messages }.flatten
10
+ unless messages.empty?
11
+ content_tag(:div, :class => "error_messages") do
12
+ list_items = messages.map { |msg| content_tag(:li, msg) }
13
+ content_tag(:h2, options[:header_message]) + content_tag(:p, options[:message]) + content_tag(:ul, list_items.join.html_safe)
14
+ end
15
+ end
16
+ end
17
+
3
18
  end
4
19
  end
@@ -0,0 +1,4 @@
1
+ module Kublog
2
+ module NotificationsHelper
3
+ end
4
+ end
@@ -34,5 +34,9 @@ module Kublog
34
34
  comment.admin? ? 'admin' : ''
35
35
  end
36
36
 
37
+ def atom_url(presenter)
38
+ presenter.category.nil? ? posts_url(:format => :atom) : category_url(presenter.category, :format => :atom)
39
+ end
40
+
37
41
  end
38
42
  end
@@ -0,0 +1,14 @@
1
+ module Kublog
2
+ class DeliverComment
3
+
4
+ def initialize(comment_id)
5
+ @comment_id = comment_id
6
+ end
7
+
8
+ def perform
9
+ comment = Comment.find(@comment_id)
10
+ CommentMailer.new_comment(comment).deliver
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Kublog
2
+ class CommentMailer < ActionMailer::Base
3
+
4
+ def new_comment(comment)
5
+ @comment, @post = comment, comment.post
6
+ subject = I18n.t('kublog.comment_mailer.new_comment.subject', :post => @post.title)
7
+ mail(:to => @post.user.email, :subject => subject, :from => @comment.email)
8
+ end
9
+
10
+ end
11
+ end
@@ -1,10 +1,9 @@
1
1
  module Kublog
2
2
  class PostMailer < ActionMailer::Base
3
- default from: "test@kublog.com"
4
-
5
- def new_post(post, user)
6
- @post, @user = post, user
7
- mail(:to => user.email, :subject => post.title.titleize)
3
+
4
+ def new_post(email, post, user)
5
+ @email, @post, @user = email, post, user
6
+ mail(:to => @user.email, :subject => @email.subject, :from => Kublog.email_from(@email.post))
8
7
  end
9
8
 
10
9
  end
@@ -1,3 +1,6 @@
1
+ # Non mandatory single category for a post
2
+ # implements friendly_id search and json defaults
3
+ # for ajax editing
1
4
  module Kublog
2
5
  class Category < ActiveRecord::Base
3
6
  extend FriendlyId
@@ -13,13 +16,18 @@ module Kublog
13
16
  self.name.titleize
14
17
  end
15
18
 
16
- # Site access to the category
17
- def path
18
- Engine.routes.url_helpers.category_path(self)
19
+ # Includes a path to the category by default
20
+ # helps reference back to edited categories in
21
+ # json requests
22
+ def as_json(params={})
23
+ params||={}
24
+ super(params.merge!({:methods => [:path]}))
19
25
  end
20
26
 
21
- def as_json(params={})
22
- super params.merge({:methods => [:path]})
27
+ protected
28
+
29
+ def path
30
+ Engine.routes.url_helpers.category_path(self)
23
31
  end
24
32
 
25
33
  end
@@ -7,29 +7,40 @@ module Kublog
7
7
  validate :has_user_details
8
8
 
9
9
  default_scope order('kublog_comments.created_at ASC')
10
+ delegate :admin?, :to => :user, :allow_nil => true
10
11
 
11
- delegate :admin?, :to => :user, :allow_nil => true
12
+ after_create :notify_author
12
13
 
13
14
  def author
14
15
  return self.author_name if self.user.nil?
15
16
  return self.user.to_s
16
17
  end
17
18
 
18
- # Site access to the category
19
- def path
20
- Engine.routes.url_helpers.post_comment_path(self.post, self)
19
+ def as_json(args={})
20
+ args ||={}
21
+ super(args.merge!({:methods => [:path, :author, :ftime, :admin?]}))
21
22
  end
22
23
 
23
- def as_json(options={})
24
- super(options.merge({:methods => [:path, :author, :ftime, :admin?]}))
24
+ def path
25
+ Engine.routes.url_helpers.post_comment_path(self.post, self)
25
26
  end
26
27
 
27
28
  def ftime
28
29
  I18n.l(self.created_at, :format => :short)
29
30
  end
30
31
 
32
+ def email
33
+ author_email || user.email
34
+ end
35
+
31
36
  private
32
37
 
38
+ def notify_author
39
+ unless self.user == self.post.user
40
+ Processor.work(DeliverComment.new(self.id))
41
+ end
42
+ end
43
+
33
44
  def has_user_details
34
45
  if self.user.nil?
35
46
  errors.add(:author_name, :blank) if author_name.blank?