cornerstone 0.0.1 → 0.0.5
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.
- data/.gitignore +6 -0
- data/.rspec +1 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +168 -0
- data/Guardfile +22 -0
- data/README.rdoc +4 -1
- data/Rakefile +11 -1
- data/TODO +11 -0
- data/VERSION +1 -0
- data/app/assets/images/.gitkeep +0 -0
- data/app/assets/javascripts/.gitkeep +0 -0
- data/app/assets/javascripts/cornerstone.js +11 -0
- data/app/assets/javascripts/cornerstone/discussions.js +2 -0
- data/app/assets/javascripts/cornerstone/help.js +2 -0
- data/app/assets/stylesheets/.gitkeep +0 -0
- data/app/assets/stylesheets/cornerstone.css +8 -0
- data/app/assets/stylesheets/cornerstone/discussions.css +4 -0
- data/app/assets/stylesheets/cornerstone/help.css +4 -0
- data/app/controllers/.gitkeep +0 -0
- data/app/controllers/cornerstone/admin/application_controller.rb +7 -0
- data/app/controllers/cornerstone/admin/articles_controller.rb +61 -0
- data/app/controllers/cornerstone/admin/categories_controller.rb +46 -0
- data/app/controllers/cornerstone/admin/discussions_controller.rb +32 -0
- data/app/controllers/cornerstone/application_controller.rb +6 -0
- data/app/controllers/cornerstone/discussions_controller.rb +58 -0
- data/app/controllers/cornerstone/help_controller.rb +11 -0
- data/app/controllers/cornerstone/posts_controller.rb +66 -0
- data/app/helpers/.gitkeep +0 -0
- data/app/helpers/cornerstone/application_helper.rb +5 -0
- data/app/helpers/cornerstone/discussions_helper.rb +16 -0
- data/app/helpers/cornerstone/help_helper.rb +4 -0
- data/app/mailers/cornerstone/cornerstone_mailer.rb +31 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/cornerstone/article.rb +20 -0
- data/app/models/cornerstone/category.rb +45 -0
- data/app/models/cornerstone/discussion.rb +90 -0
- data/app/models/cornerstone/post.rb +103 -0
- data/app/models/cornerstone/post_observer.rb +23 -0
- data/app/views/.gitkeep +0 -0
- data/app/views/cornerstone/admin/articles/_article.html.erb +9 -0
- data/app/views/cornerstone/admin/articles/_form.html.erb +22 -0
- data/app/views/cornerstone/admin/articles/edit.html.erb +7 -0
- data/app/views/cornerstone/admin/articles/index.html.erb +25 -0
- data/app/views/cornerstone/admin/articles/new.html.erb +6 -0
- data/app/views/cornerstone/admin/articles/show.html.erb +4 -0
- data/app/views/cornerstone/admin/categories/_category.html.erb +12 -0
- data/app/views/cornerstone/admin/categories/_form.html.erb +17 -0
- data/app/views/cornerstone/admin/categories/edit.html.erb +6 -0
- data/app/views/cornerstone/admin/categories/index.html.erb +11 -0
- data/app/views/cornerstone/admin/categories/new.html.erb +6 -0
- data/app/views/cornerstone/admin/discussions/edit.html.erb +7 -0
- data/app/views/cornerstone/cornerstone_mailer/new_discussion.html.erb +14 -0
- data/app/views/cornerstone/cornerstone_mailer/new_discussion.text.erb +5 -0
- data/app/views/cornerstone/cornerstone_mailer/new_discussion_user.html.erb +7 -0
- data/app/views/cornerstone/cornerstone_mailer/new_post.html.erb +7 -0
- data/app/views/cornerstone/cornerstone_mailer/new_post.text.erb +8 -0
- data/app/views/cornerstone/discussions/_discussion.html.erb +12 -0
- data/app/views/cornerstone/discussions/_discussion_category.html.erb +14 -0
- data/app/views/cornerstone/discussions/_form.html.erb +33 -0
- data/app/views/cornerstone/discussions/_latest_discussion.html.erb +4 -0
- data/app/views/cornerstone/discussions/categorical_index.html.erb +27 -0
- data/app/views/cornerstone/discussions/index.html.erb +25 -0
- data/app/views/cornerstone/discussions/new.html.erb +6 -0
- data/app/views/cornerstone/discussions/show.html.erb +19 -0
- data/app/views/cornerstone/help/index.html.erb +7 -0
- data/app/views/cornerstone/posts/_fields.html.erb +44 -0
- data/app/views/cornerstone/posts/_form.html.erb +19 -0
- data/app/views/cornerstone/posts/_post.html.erb +17 -0
- data/app/views/cornerstone/posts/edit.html.erb +9 -0
- data/app/views/cornerstone/shared/_errors.html.erb +11 -0
- data/app/views/cornerstone/shared/_flash_messages.html.erb +15 -0
- data/app/views/layouts/cornerstone/application.html.erb +16 -0
- data/config/cucumber.yml +8 -0
- data/config/locales/cornerstone.action_mailer.en.yml +9 -0
- data/config/routes.rb +24 -0
- data/cornerstone-0.0.1.gem +0 -0
- data/cornerstone.gemspec +33 -0
- data/db/migrate/20110723004024_create_cornerstone_discussions.rb +17 -0
- data/db/migrate/20110804190853_create_cornerstone_categories.rb +15 -0
- data/db/migrate/20110809233551_create_cornerstone_posts.rb +13 -0
- data/db/migrate/20111006172857_create_cornerstone_articles.rb +12 -0
- data/lib/cornerstone.rb +6 -0
- data/lib/cornerstone/acts_as_cornerstone_user.rb +79 -0
- data/lib/cornerstone/config.rb +33 -0
- data/lib/cornerstone/controller_additions.rb +25 -0
- data/lib/cornerstone/engine.rb +8 -1
- data/lib/cornerstone/exceptions.rb +16 -0
- data/lib/cornerstone/helpers.rb +35 -0
- data/lib/tasks/cucumber.rake +65 -0
- data/lib/templates/cornerstone_config.rb +31 -0
- data/script/cucumber +10 -0
- data/script/rails +7 -0
- data/spec/controllers/cornerstone/admin/articles_controller_spec.rb +250 -0
- data/spec/controllers/cornerstone/admin/categories_controller_spec.rb +205 -0
- data/spec/controllers/cornerstone/admin/discussions_controller_spec.rb +95 -0
- data/spec/controllers/cornerstone/application_controller_spec.rb +34 -0
- data/spec/controllers/cornerstone/discussions_controller_spec.rb +157 -0
- data/spec/controllers/cornerstone/help_controller_spec.rb +20 -0
- data/spec/controllers/cornerstone/posts_controller_spec.rb +212 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/javascripts/tester.js +2 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/assets/stylesheets/tester.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/tester_controller.rb +7 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/tester_helper.rb +6 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/user.rb +23 -0
- data/spec/dummy/app/views/devise/confirmations/new.html.erb +12 -0
- data/spec/dummy/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/spec/dummy/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/spec/dummy/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/spec/dummy/app/views/devise/passwords/edit.html.erb +16 -0
- data/spec/dummy/app/views/devise/passwords/new.html.erb +12 -0
- data/spec/dummy/app/views/devise/registrations/edit.html.erb +29 -0
- data/spec/dummy/app/views/devise/registrations/new.html.erb +22 -0
- data/spec/dummy/app/views/devise/sessions/new.html.erb +19 -0
- data/spec/dummy/app/views/devise/shared/_links.erb +25 -0
- data/spec/dummy/app/views/devise/unlocks/new.html.erb +12 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/app/views/tester/index.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +42 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +28 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +31 -0
- data/spec/dummy/config/environments/production.rb +54 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cornerstone_config.rb +30 -0
- data/spec/dummy/config/initializers/devise.rb +204 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/devise.en.yml +53 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +65 -0
- data/spec/dummy/db/migrate/20110724011421_create_user.rb +11 -0
- data/spec/dummy/db/migrate/20110724194307_devise_create_users.rb +41 -0
- data/spec/dummy/db/migrate/20110804174004_add_name_to_user.rb +5 -0
- data/spec/dummy/db/schema.rb +76 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/test/functional/tester_controller_test.rb +9 -0
- data/spec/dummy/test/unit/helpers/tester_helper_test.rb +4 -0
- data/spec/fixtures/cornerstone/cornerstone_mailer/new_discussion +3 -0
- data/spec/lib/cornerstone/acts_as_cornerstone_user_spec.rb +56 -0
- data/spec/lib/cornerstone/helpers_spec.rb +32 -0
- data/spec/mailers/cornerstone/cornerstone_mailer_spec.rb +55 -0
- data/spec/models/cornerstone/article_spec.rb +25 -0
- data/spec/models/cornerstone/category_spec.rb +97 -0
- data/spec/models/cornerstone/discussion_spec.rb +243 -0
- data/spec/models/cornerstone/post_observer_spec.rb +65 -0
- data/spec/models/cornerstone/post_spec.rb +210 -0
- data/spec/requests/emails_spec.rb +51 -0
- data/spec/requests/interact_discussions_spec.rb +103 -0
- data/spec/requests/manage_articles_spec.rb +59 -0
- data/spec/requests/manage_categories_spec.rb +64 -0
- data/spec/requests/view_home_spec.rb +26 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/devise.rb +4 -0
- data/spec/support/factories.rb +62 -0
- data/spec/support/general_helper_methods.rb +20 -0
- data/spec/support/mailer_macros.rb +15 -0
- data/spec/support/mass_assignment.rb +46 -0
- data/tmp/log/development.log +0 -0
- metadata +301 -20
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
class DiscussionsController < ApplicationController
|
|
3
|
+
|
|
4
|
+
respond_to :html
|
|
5
|
+
|
|
6
|
+
# GET /cornerstone/discussions/
|
|
7
|
+
def index
|
|
8
|
+
@categories = Category.discussions
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# GET /cornerstone/discussions/new
|
|
12
|
+
def new
|
|
13
|
+
@categories = Category.discussions
|
|
14
|
+
@category = Category.find(params[:cat]) if params[:cat]
|
|
15
|
+
@discussion = Discussion.new
|
|
16
|
+
@discussion.category_id = @category.id if @category
|
|
17
|
+
@discussion.posts.build
|
|
18
|
+
respond_with(@discussion)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# GET /cornerstone/discussions/:category
|
|
22
|
+
def category
|
|
23
|
+
@category = Category.includes(:discussions => :posts).find(params[:category])
|
|
24
|
+
@discussions = @category.discussions
|
|
25
|
+
respond_with(@discussions, :template => "cornerstone/discussions/categorical_index")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# GET /cornerstone/discussions/:category/:id
|
|
29
|
+
def show
|
|
30
|
+
@discussion = Discussion.includes(:posts => :user).find(params[:id])
|
|
31
|
+
@new_post = Post.new
|
|
32
|
+
@posts = @discussion.posts
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# POST /cornerstone/discussions/
|
|
36
|
+
def create
|
|
37
|
+
@discussion = Discussion.new(params[:discussion])
|
|
38
|
+
|
|
39
|
+
# assign user if signed in
|
|
40
|
+
if current_cornerstone_user
|
|
41
|
+
@discussion.user = current_cornerstone_user
|
|
42
|
+
@discussion.posts.first.user = current_cornerstone_user
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
respond_with(@discussion.category, @discussion) do |format|
|
|
46
|
+
if @discussion.save
|
|
47
|
+
flash[:notice] = 'Discussion was successfully created.'
|
|
48
|
+
format.html {redirect_to category_discussion_path(@discussion.category, @discussion)}
|
|
49
|
+
else
|
|
50
|
+
@categories = Category.discussions
|
|
51
|
+
format.html {render :new}
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
class PostsController < ApplicationController
|
|
3
|
+
respond_to :html
|
|
4
|
+
|
|
5
|
+
# POST /cornerstone/discussions/:discussion_id/posts
|
|
6
|
+
def create
|
|
7
|
+
@discussion = Discussion.includes(:posts => :user).find(params[:discussion_id])
|
|
8
|
+
existing_posts = @discussion.posts.dup
|
|
9
|
+
@post = @discussion.posts.new(params[:post])
|
|
10
|
+
|
|
11
|
+
# assign user if signed in
|
|
12
|
+
if current_cornerstone_user
|
|
13
|
+
@post.user = current_cornerstone_user
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
respond_with(@discussion, @post) do |format|
|
|
17
|
+
if @post.save
|
|
18
|
+
# close discussion if commit param dictates
|
|
19
|
+
unless params[:comment_close].nil?
|
|
20
|
+
@discussion.update_attribute(:status, Discussion::STATUS.last)
|
|
21
|
+
else
|
|
22
|
+
# re-open discussion if discussion is closed
|
|
23
|
+
if @discussion.closed?
|
|
24
|
+
@discussion.update_attribute(:status, Discussion::STATUS.first)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
flash[:notice] = 'Comment was successfully created.'
|
|
29
|
+
format.html {redirect_to category_discussion_path(@discussion.category, @discussion)}
|
|
30
|
+
else
|
|
31
|
+
@new_post = @post
|
|
32
|
+
@posts = existing_posts
|
|
33
|
+
format.html {render :template => "cornerstone/discussions/show"}
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# GET /cornerstone/discussions/:discussion_id/posts/:id/edit
|
|
39
|
+
def edit
|
|
40
|
+
@post = Post.includes(:user, :discussion).find(params[:id])
|
|
41
|
+
raise Cornerstone::AccessDenied unless @post.created_by?(current_cornerstone_user)
|
|
42
|
+
@discussion = @post.discussion
|
|
43
|
+
respond_with(@discussion, @post)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# PUT /cornerstone/discussions/:discussion_id/posts/:id
|
|
47
|
+
def update
|
|
48
|
+
@post = Post.includes(:user, :discussion).find(params[:id])
|
|
49
|
+
raise Cornerstone::AccessDenied unless @post.created_by?(current_cornerstone_user)
|
|
50
|
+
@discussion = @post.discussion
|
|
51
|
+
flash[:notice] = "Post was successfully updated." if @post.update_attributes(params[:post])
|
|
52
|
+
respond_with(@discussion, @post, :location => category_discussion_path(@discussion.category, @discussion))
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# DELETE /cornerstone/discussions/:discussion_id/posts/:id
|
|
56
|
+
def destroy
|
|
57
|
+
@post = Post.includes(:user, :discussion).find(params[:id])
|
|
58
|
+
raise Cornerstone::AccessDenied unless @post.created_by?(current_cornerstone_user)
|
|
59
|
+
@discussion = @post.discussion
|
|
60
|
+
flash[:notice] = "Post was successfully deleted." if @post.destroy
|
|
61
|
+
respond_with(@discussion, @post, :location => category_discussion_path(@discussion.category, @discussion))
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
File without changes
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
module DiscussionsHelper
|
|
3
|
+
|
|
4
|
+
# Returns details and links about the latest discussion for a given category
|
|
5
|
+
def latest_discussion_details(category)
|
|
6
|
+
if discussion = category.latest_discussion
|
|
7
|
+
render :partial => 'latest_discussion', :object => discussion,
|
|
8
|
+
:locals => {:category => category}
|
|
9
|
+
else
|
|
10
|
+
"N/A"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
class CornerstoneMailer < ActionMailer::Base
|
|
3
|
+
default from: Cornerstone::Config.mailer_from
|
|
4
|
+
|
|
5
|
+
# Email admins on new discussion - refer to post observer
|
|
6
|
+
def new_discussion(post, discussion)
|
|
7
|
+
@post = post
|
|
8
|
+
@discussion = discussion
|
|
9
|
+
mail :to => Cornerstone::Config.admin_emails
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Email user that created new discussion - refer to post observer
|
|
13
|
+
def new_discussion_user(post, discussion)
|
|
14
|
+
@post = post
|
|
15
|
+
@discussion = discussion
|
|
16
|
+
mail :to => post.author_email
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Email a single participant within a discussion - refer to post observer
|
|
20
|
+
def new_post(name, email, post, discussion)
|
|
21
|
+
@post = post
|
|
22
|
+
@discussion = discussion
|
|
23
|
+
@name = name
|
|
24
|
+
|
|
25
|
+
mail :to => email,
|
|
26
|
+
:subject => I18n.t('cornerstone.cornerstone_mailer.new_post.subject',
|
|
27
|
+
:topic => @discussion.subject)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
data/app/models/.gitkeep
ADDED
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
class Article < ActiveRecord::Base
|
|
3
|
+
# == CONSTANTS == #
|
|
4
|
+
|
|
5
|
+
# == ASSOCIATIONS == #
|
|
6
|
+
belongs_to :category
|
|
7
|
+
|
|
8
|
+
# == ACCESSIBILITY == #
|
|
9
|
+
# == SCOPES == #
|
|
10
|
+
|
|
11
|
+
# == VALIDATIONS == #
|
|
12
|
+
validates_presence_of :title, :body, :category
|
|
13
|
+
|
|
14
|
+
# == CALLBACKS == #
|
|
15
|
+
# == CLASS METHODS == #
|
|
16
|
+
# == INSTANCE METHODS == #
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
class Category < ActiveRecord::Base
|
|
3
|
+
|
|
4
|
+
# == CONSTANTS == #
|
|
5
|
+
TYPES = ["Discussion", "Article"]
|
|
6
|
+
|
|
7
|
+
# == ASSOCIATIONS == #
|
|
8
|
+
has_many :discussions, :dependent => :destroy
|
|
9
|
+
has_many :articles, :dependent => :destroy
|
|
10
|
+
|
|
11
|
+
# == ACCESSIBILITY == #
|
|
12
|
+
attr_accessible :name, :category_type, :description
|
|
13
|
+
|
|
14
|
+
# == SCOPES == #
|
|
15
|
+
|
|
16
|
+
scope :discussions, lambda { where("cornerstone_categories.category_type = 'Discussion'") }
|
|
17
|
+
scope :articles, lambda { where("cornerstone_categories.category_type = 'Article'") }
|
|
18
|
+
|
|
19
|
+
# == VALIDATIONS == #
|
|
20
|
+
validates :name, :presence => true,
|
|
21
|
+
:length => {:maximum => 50}
|
|
22
|
+
|
|
23
|
+
validates :category_type, :inclusion => { :in => Cornerstone::Category::TYPES }
|
|
24
|
+
|
|
25
|
+
validates :description, :presence => true,
|
|
26
|
+
:length => {:maximum => 500}
|
|
27
|
+
|
|
28
|
+
# == CALLBACKS == #
|
|
29
|
+
# == CLASS METHODS == #
|
|
30
|
+
|
|
31
|
+
# == INSTANCE METHODS == #
|
|
32
|
+
|
|
33
|
+
# Provides the latest discussion created for this category
|
|
34
|
+
def latest_discussion
|
|
35
|
+
latest_discussions(1).first
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Provides the last 'num' discussions created for this category
|
|
39
|
+
def latest_discussions(num=nil)
|
|
40
|
+
Discussion.latest_for_category(self, num)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
class Discussion < ActiveRecord::Base
|
|
3
|
+
|
|
4
|
+
# == CONSTANTS == #
|
|
5
|
+
STATUS = Cornerstone::Config.discussion_statuses
|
|
6
|
+
|
|
7
|
+
# == ASSOCIATIONS == #
|
|
8
|
+
belongs_to :category, :counter_cache => :item_count
|
|
9
|
+
# belongs_to 'user' also established by acts_as_cornerstone_user
|
|
10
|
+
|
|
11
|
+
has_many :posts, :dependent => :destroy
|
|
12
|
+
accepts_nested_attributes_for :posts
|
|
13
|
+
|
|
14
|
+
# == ACCESSIBILITY == #
|
|
15
|
+
attr_accessible :subject, :privte, :category_id, :posts_attributes
|
|
16
|
+
|
|
17
|
+
# == SCOPES == #
|
|
18
|
+
default_scope :order => "created_at DESC",
|
|
19
|
+
:conditions => {:privte => false}
|
|
20
|
+
|
|
21
|
+
scope :latest_for_category, lambda { |cat, num=5|
|
|
22
|
+
where(:category_id => cat.id)
|
|
23
|
+
.limit(num) }
|
|
24
|
+
|
|
25
|
+
# == VALIDATIONS == #
|
|
26
|
+
validates :subject, :presence => true,
|
|
27
|
+
:length => { :maximum => 50 }
|
|
28
|
+
|
|
29
|
+
validates :status, :inclusion => { :in => Cornerstone::Discussion::STATUS }
|
|
30
|
+
|
|
31
|
+
validates :category, :presence => true
|
|
32
|
+
|
|
33
|
+
# == CALLBACKS == #
|
|
34
|
+
after_save :set_latest_discussion, :on => :create
|
|
35
|
+
|
|
36
|
+
# == CLASS METHODS == #
|
|
37
|
+
|
|
38
|
+
# == INSTANCE METHODS == #
|
|
39
|
+
def author_name
|
|
40
|
+
self.posts.first.author_name
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# returns true if discussion is 'closed'
|
|
44
|
+
def closed?
|
|
45
|
+
self.status == Cornerstone::Discussion::STATUS.last
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# returns true if it was created by given user or if given user is an admin
|
|
49
|
+
def created_by?(check_user)
|
|
50
|
+
return false unless check_user.present?
|
|
51
|
+
return true if check_user.cornerstone_admin?
|
|
52
|
+
self.user && self.user == check_user
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# returns an array of participants for the discussion
|
|
56
|
+
def participants(exclude_email=nil)
|
|
57
|
+
ps = []
|
|
58
|
+
self.posts.each do |p|
|
|
59
|
+
if p.author_name && p.author_email
|
|
60
|
+
ps << [p.author_name, p.author_email]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
ps.delete_if{|p| p[1] == exclude_email}.uniq
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# return a nicely formatted string for emailing
|
|
67
|
+
# i.e. Name <email_address>, Name <email_address>
|
|
68
|
+
def participants_email_list(exclude_email=nil)
|
|
69
|
+
participants(exclude_email).collect{ |p| "#{p[0]} <#{p[1]}>" }.join(", ")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
#######
|
|
73
|
+
private
|
|
74
|
+
#######
|
|
75
|
+
|
|
76
|
+
# Update the category's latest discussion author/date
|
|
77
|
+
def set_latest_discussion
|
|
78
|
+
post = self.posts.first
|
|
79
|
+
if post
|
|
80
|
+
cat = self.category
|
|
81
|
+
cat.latest_discussion_author = post.author_name
|
|
82
|
+
cat.latest_discussion_date = Time.now.to_s(:db)
|
|
83
|
+
cat.save
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
module Cornerstone
|
|
2
|
+
class Post < ActiveRecord::Base
|
|
3
|
+
|
|
4
|
+
belongs_to :discussion
|
|
5
|
+
# belongs_to 'user' also established by acts_as_cornerstone_user
|
|
6
|
+
|
|
7
|
+
# == CONSTANTS == #
|
|
8
|
+
# == ASSOCIATIONS == #
|
|
9
|
+
# == ACCESSIBILITY == #
|
|
10
|
+
attr_accessible :body, :name, :email
|
|
11
|
+
|
|
12
|
+
# == SCOPES == #
|
|
13
|
+
default_scope :order => "created_at ASC"
|
|
14
|
+
|
|
15
|
+
# == VALIDATIONS == #
|
|
16
|
+
|
|
17
|
+
validates :body, :presence => true,
|
|
18
|
+
:length => {:maximum => 3000}
|
|
19
|
+
|
|
20
|
+
validates :name, :presence => true,
|
|
21
|
+
:length => { :maximum => 50 },
|
|
22
|
+
:if => Proc.new { |p| !p.try(:user) }
|
|
23
|
+
|
|
24
|
+
validates :email, :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i },
|
|
25
|
+
:if => Proc.new { |p| !p.try(:user) }
|
|
26
|
+
|
|
27
|
+
# == CALLBACKS == #
|
|
28
|
+
after_save :update_counter_cache
|
|
29
|
+
after_save :set_latest_post, :on => :create
|
|
30
|
+
|
|
31
|
+
after_destroy :update_counter_cache
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# TODO: SANITATION ON NAME BODY EMAIL
|
|
37
|
+
|
|
38
|
+
# == CLASS METHODS == #
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# == INSTANCE METHODS == #
|
|
42
|
+
|
|
43
|
+
# return the author name of the post
|
|
44
|
+
def author_name
|
|
45
|
+
#@cornerstone_name ||= anonymous_or_user_attr(:name)
|
|
46
|
+
anonymous_or_user_attr(:cornerstone_name)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# return the author email of the post
|
|
50
|
+
def author_email
|
|
51
|
+
#@cornerstone_email ||= anonymous_or_user_attr(:email)
|
|
52
|
+
anonymous_or_user_attr(:cornerstone_email)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# returns true if it was created by given user or if given user is an admin
|
|
56
|
+
def created_by?(check_user)
|
|
57
|
+
return false unless check_user.present?
|
|
58
|
+
return true if check_user.cornerstone_admin?
|
|
59
|
+
self.user && self.user == check_user
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#######
|
|
63
|
+
private
|
|
64
|
+
#######
|
|
65
|
+
|
|
66
|
+
# Custom counter cache. Does not include the first post of a discussion.
|
|
67
|
+
def update_counter_cache
|
|
68
|
+
self.discussion.reply_count = Post.where(:discussion_id => self.discussion.id)
|
|
69
|
+
.count - 1
|
|
70
|
+
self.discussion.save
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Returns the requested attribute of the user if it exists, or post's attribute
|
|
74
|
+
def anonymous_or_user_attr(attr)
|
|
75
|
+
unless self.user_id.nil?
|
|
76
|
+
mthd = "user_#{attr.to_s}"
|
|
77
|
+
# TODO: rails caching is messing this relationship up.
|
|
78
|
+
# will .user work even if model name is something else. e.g. AdminUser ??
|
|
79
|
+
self.user.send(attr)
|
|
80
|
+
else
|
|
81
|
+
case attr
|
|
82
|
+
when :cornerstone_name
|
|
83
|
+
self.send(:name)
|
|
84
|
+
when :cornerstone_email
|
|
85
|
+
self.send(:email)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Update the discussion's latest post author/date
|
|
91
|
+
def set_latest_post
|
|
92
|
+
discussion = self.discussion
|
|
93
|
+
if discussion
|
|
94
|
+
discussion.latest_post_author = self.author_name
|
|
95
|
+
discussion.latest_post_date = Time.now.to_s(:db)
|
|
96
|
+
discussion.save
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|