crowdblog 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +5 -0
- data/.gitignore +1 -0
- data/app/assets/javascripts/crowdblog/models/post.js.coffee.erb +1 -1
- data/app/assets/stylesheets/application.css +3 -0
- data/app/controllers/crowdblog/admin/assets_controller.rb +20 -0
- data/app/controllers/crowdblog/admin/authors_controller.rb +11 -0
- data/app/controllers/crowdblog/admin/base_controller.rb +7 -0
- data/app/controllers/crowdblog/admin/posts_controller.rb +71 -0
- data/app/controllers/crowdblog/application_controller.rb +8 -7
- data/app/controllers/crowdblog/posts_controller.rb +2 -66
- data/app/models/crowdblog/post.rb +2 -2
- data/app/models/crowdblog/user.rb +18 -26
- data/app/views/crowdblog/{authors → admin/authors}/index.html.slim +0 -0
- data/app/views/crowdblog/{posts → admin/posts}/_form.html.slim +0 -0
- data/app/views/crowdblog/admin/posts/_post.html.slim +13 -0
- data/app/views/crowdblog/{posts → admin/posts}/edit.html.slim +2 -2
- data/app/views/crowdblog/admin/posts/index.html.slim +24 -0
- data/app/views/crowdblog/{posts → admin/posts}/new.html.slim +0 -0
- data/app/views/crowdblog/{posts → admin/posts}/update.json.jbuilder +0 -0
- data/app/views/crowdblog/application/_navbar.html.slim +4 -6
- data/app/views/crowdblog/posts/_post.html.slim +4 -13
- data/app/views/crowdblog/posts/index.html.slim +1 -24
- data/app/views/layouts/crowdblog/admin/base.html.slim +20 -0
- data/app/views/layouts/crowdblog/application.html.slim +2 -3
- data/config/routes.rb +9 -8
- data/crowdblog.gemspec +2 -1
- data/lib/crowdblog.rb +1 -4
- data/lib/crowdblog/rspec/crowdblog_shared_examples.rb +70 -73
- data/lib/crowdblog/version.rb +1 -1
- data/lib/generators/crowdblog/views_generator.rb +11 -0
- data/spec/dummy/app/controllers/application_controller.rb +0 -2
- data/spec/dummy/config/routes.rb +1 -3
- data/spec/dummy/db/schema.rb +1 -42
- data/spec/generators/crowdblog/views_generator_spec.rb +16 -0
- data/spec/models/post_spec.rb +4 -14
- metadata +46 -35
- data/app/assets/images/crowdblog/logo.png +0 -0
- data/app/controllers/crowdblog/assets_controller.rb +0 -18
- data/app/controllers/crowdblog/authors_controller.rb +0 -9
- data/app/controllers/crowdblog/devise/sessions_controller.rb +0 -3
- data/config/initializers/devise.rb +0 -16
- data/db/migrate/20120215232711_create_crowdblog_users.rb +0 -23
- data/db/migrate/20120220033923_create_vestal_versions.rb +0 -28
- data/spec/dummy/app/controllers/admin_controller.rb +0 -0
- data/spec/dummy/app/controllers/home_controller.rb +0 -4
- data/spec/dummy/app/controllers/sessions_controller.rb +0 -2
- data/spec/dummy/config/initializers/devise.rb +0 -222
- data/spec/models/user_spec.rb +0 -81
data/.autotest
ADDED
data/.gitignore
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Crowdblog
|
2
|
+
module Admin
|
3
|
+
class AssetsController < Crowdblog::Admin::BaseController
|
4
|
+
# TODO: Skipping filters is the worst solution ever to this problem
|
5
|
+
# Someone should fix the uploadify.js thing
|
6
|
+
skip_before_filter :verify_authenticity_token, :only => :create
|
7
|
+
skip_before_filter :authorize!
|
8
|
+
|
9
|
+
def create
|
10
|
+
@post = Post.find(params[:post_id])
|
11
|
+
asset = @post.assets.build
|
12
|
+
asset.attachment = params['attachment']
|
13
|
+
asset.save!
|
14
|
+
|
15
|
+
render json: asset
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Crowdblog
|
2
|
+
module Admin
|
3
|
+
class PostsController < Crowdblog::Admin::BaseController
|
4
|
+
respond_to :html, :json
|
5
|
+
cache_sweeper :post_sweeper
|
6
|
+
|
7
|
+
before_filter :load_post, :only => [ :edit, :update, :destroy ]
|
8
|
+
|
9
|
+
def new
|
10
|
+
@post = Post.new
|
11
|
+
@post.author = current_user
|
12
|
+
@post.save!
|
13
|
+
redirect_to edit_admin_post_path(@post)
|
14
|
+
end
|
15
|
+
|
16
|
+
def index
|
17
|
+
@state = params[:state]
|
18
|
+
@posts = Post.scoped_for(current_user).for_admin_index
|
19
|
+
@posts = @posts.with_state(@state) if @state
|
20
|
+
respond_with @posts
|
21
|
+
end
|
22
|
+
|
23
|
+
def create
|
24
|
+
@post = Post.new(post_params)
|
25
|
+
@post.author = current_user
|
26
|
+
@post.regenerate_permalink
|
27
|
+
if @post.save
|
28
|
+
respond_with @post, :location => crowdblog.admin_posts_path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
@post.destroy
|
34
|
+
respond_with @post, :location => crowdblog.admin_posts_path
|
35
|
+
end
|
36
|
+
|
37
|
+
def show
|
38
|
+
@post = Post.includes(:assets).find(params[:id])
|
39
|
+
respond_to do |format|
|
40
|
+
format.json { render json: @post.to_json(include: :assets) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def edit
|
45
|
+
end
|
46
|
+
|
47
|
+
def update
|
48
|
+
@post.update_attributes(post_params, updated_by: current_user)
|
49
|
+
if @post.allowed_to_update_permalink?
|
50
|
+
@post.regenerate_permalink
|
51
|
+
@post.save!
|
52
|
+
end
|
53
|
+
|
54
|
+
@post.publish_if_allowed(post_params[:transition], current_user) if post_params[:transition]
|
55
|
+
|
56
|
+
respond_with @post do |format|
|
57
|
+
format.html { redirect_to crowdblog.admin_posts_path }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def load_post
|
63
|
+
@post = Post.scoped_for(current_user).find(params[:id])
|
64
|
+
end
|
65
|
+
|
66
|
+
def post_params
|
67
|
+
params.require(:post).permit(:title, :body, :updated_by, :ready_for_review, :transition)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module Crowdblog
|
2
2
|
class ApplicationController < ActionController::Base
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
def method_missing(method_name)
|
4
|
+
if method_name == :current_user
|
5
|
+
Rails.logger.warn("current_user in Crowdblog::ApplicationController should be overriden")
|
6
|
+
User.new
|
7
|
+
elsif method_name == :authenticate_user!
|
8
|
+
Rails.logger.warn("authenticate_user! in Crowdblog::ApplicationController should be overriden")
|
9
|
+
end
|
7
10
|
end
|
8
11
|
|
9
|
-
|
10
|
-
crowdblog.new_user_session_path
|
11
|
-
end
|
12
|
+
helper_method :current_user
|
12
13
|
end
|
13
14
|
end
|
@@ -1,71 +1,7 @@
|
|
1
1
|
module Crowdblog
|
2
|
-
class PostsController <
|
3
|
-
before_filter :authenticate_user!
|
4
|
-
|
5
|
-
respond_to :html, :json
|
6
|
-
cache_sweeper :post_sweeper
|
7
|
-
|
8
|
-
before_filter :load_post, :only => [ :edit, :update, :destroy ]
|
9
|
-
|
10
|
-
def new
|
11
|
-
@post = Post.new
|
12
|
-
@post.author = current_user
|
13
|
-
@post.save!
|
14
|
-
redirect_to edit_post_path(@post)
|
15
|
-
end
|
16
|
-
|
2
|
+
class PostsController < ApplicationController
|
17
3
|
def index
|
18
|
-
@
|
19
|
-
@posts = Post.scoped_for(current_user).for_admin_index
|
20
|
-
@posts = @posts.with_state(@state) if @state
|
21
|
-
respond_with @posts
|
22
|
-
end
|
23
|
-
|
24
|
-
def create
|
25
|
-
@post = Post.new(post_params)
|
26
|
-
@post.author = current_user
|
27
|
-
@post.regenerate_permalink
|
28
|
-
if @post.save
|
29
|
-
respond_with @post, :location => crowdblog.posts_path
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def destroy
|
34
|
-
@post.destroy
|
35
|
-
respond_with @post, :location => crowdblog.posts_path
|
36
|
-
end
|
37
|
-
|
38
|
-
def show
|
39
|
-
@post = Post.includes(:assets).find(params[:id])
|
40
|
-
respond_to do |format|
|
41
|
-
format.json { render json: @post.to_json(include: :assets) }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def edit
|
46
|
-
end
|
47
|
-
|
48
|
-
def update
|
49
|
-
@post.update_attributes(post_params, updated_by: current_user)
|
50
|
-
if @post.allowed_to_update_permalink?
|
51
|
-
@post.regenerate_permalink
|
52
|
-
@post.save!
|
53
|
-
end
|
54
|
-
|
55
|
-
@post.publish_if_allowed(post_params[:transition], current_user) if post_params[:transition]
|
56
|
-
|
57
|
-
respond_with @post do |format|
|
58
|
-
format.html { redirect_to crowdblog.posts_path }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
def load_post
|
64
|
-
@post = Post.scoped_for(current_user).find(params[:id])
|
65
|
-
end
|
66
|
-
|
67
|
-
def post_params
|
68
|
-
params.require(:post).permit(:title, :body, :updated_by, :ready_for_review, :transition)
|
4
|
+
@posts = Post.published_and_ordered
|
69
5
|
end
|
70
6
|
end
|
71
7
|
end
|
@@ -4,8 +4,8 @@ module Crowdblog
|
|
4
4
|
belongs_to :publisher, class_name: 'User'
|
5
5
|
has_many :assets
|
6
6
|
|
7
|
-
delegate :name, to: :author, prefix: true
|
8
|
-
delegate :email, to: :author, prefix: true
|
7
|
+
delegate :name, to: :author, prefix: true, allow_nil: true
|
8
|
+
delegate :email, to: :author, prefix: true, allow_nil: true
|
9
9
|
delegate :gravatar_url, to: :author
|
10
10
|
|
11
11
|
delegate :year, to: :published_at
|
@@ -1,38 +1,30 @@
|
|
1
|
-
module
|
2
|
-
class User
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
devise :database_authenticatable, :token_authenticatable, :trackable
|
11
|
-
|
12
|
-
validate :email, uniqueness: true
|
13
|
-
|
14
|
-
attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :is_publisher
|
1
|
+
module Crowdblog
|
2
|
+
class User
|
3
|
+
attr_accessor :email
|
4
|
+
attr_accessor :name
|
5
|
+
attr_accessor :id
|
6
|
+
|
7
|
+
def is_publisher?
|
8
|
+
true
|
9
|
+
end
|
15
10
|
|
16
|
-
|
17
|
-
|
18
|
-
gravatar_alias || email
|
11
|
+
def self.primary_key
|
12
|
+
"id"
|
19
13
|
end
|
20
14
|
|
21
|
-
def
|
22
|
-
|
15
|
+
def [](value)
|
16
|
+
[]
|
23
17
|
end
|
24
18
|
|
25
|
-
def
|
26
|
-
|
19
|
+
def destroyed?
|
20
|
+
false
|
27
21
|
end
|
28
22
|
|
29
|
-
def
|
30
|
-
|
23
|
+
def new_record?
|
24
|
+
true
|
31
25
|
end
|
32
26
|
|
33
|
-
def
|
34
|
-
[email.split('@').first]
|
27
|
+
def save(*)
|
35
28
|
end
|
36
29
|
end
|
37
30
|
end
|
38
|
-
|
File without changes
|
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
= content_tag_for :tr, post, :"data-post-id" => post.id, :"data-state" => post.state, :"data-ready-for-review" => post.ready_for_review do
|
2
|
+
td= post.title
|
3
|
+
td= post.author_email
|
4
|
+
td.span2.published-at = post.published_at.try(:to_s, :crowdblog_short)
|
5
|
+
td.span1
|
6
|
+
- if current_user.is_publisher?
|
7
|
+
= link_to 'Publish', '#', :class => "btn btn-small publish #{(post.published? ? 'btn-success' : 'btn-danger')}"
|
8
|
+
td.span1
|
9
|
+
= link_to 'Review', '#', :class => "btn btn-small review #{(post.ready_for_review ? 'btn-warning' : '')}"
|
10
|
+
td.span1
|
11
|
+
= link_to 'Delete', crowdblog.admin_post_path(post), :method => :delete, :confirm => 'Are you sure?', :class => "btn btn-small"
|
12
|
+
td.span1
|
13
|
+
= link_to 'Edit', crowdblog.edit_admin_post_path(post), :class => "btn btn-small"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
.span12
|
2
2
|
h2 Edit Post
|
3
3
|
|
4
|
-
= form_for @post do |f|
|
4
|
+
= form_for [:admin, @post] do |f|
|
5
5
|
= render 'form', :f => f
|
6
6
|
|
7
7
|
.form-actions.clear
|
@@ -9,6 +9,6 @@
|
|
9
9
|
.span1
|
10
10
|
= f.submit "Update", :class => "btn btn-primary"
|
11
11
|
.span1
|
12
|
-
= link_to 'Cancel', crowdblog.
|
12
|
+
= link_to 'Cancel', crowdblog.admin_posts_path, :class => "btn"
|
13
13
|
|
14
14
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
.span12
|
2
|
+
h1 Posts
|
3
|
+
|
4
|
+
.row
|
5
|
+
.span3.new-link
|
6
|
+
= link_to 'New Post', crowdblog.new_admin_post_path, :class => "btn btn-primary btn-small"
|
7
|
+
.span3.offset6
|
8
|
+
ul.nav.nav-pills
|
9
|
+
li class="#{@state ? '' : 'active'}"
|
10
|
+
= link_to 'All', crowdblog.admin_posts_path
|
11
|
+
li class="#{@state == 'published' ? 'active' : ''}"
|
12
|
+
= link_to 'Published', crowdblog.admin_posts_by_state_path('published')
|
13
|
+
li class="#{@state == 'drafted' ? 'active' : ''}"
|
14
|
+
= link_to 'Drafted', crowdblog.admin_posts_by_state_path('drafted')
|
15
|
+
|
16
|
+
#posts.container
|
17
|
+
table.table.table-striped= render :partial => 'post', :collection => @posts
|
18
|
+
|
19
|
+
- content_for :scripts do
|
20
|
+
coffee:
|
21
|
+
$ ->
|
22
|
+
$('tr.post').each (index, el) ->
|
23
|
+
new Crowdblog.Views.PostView
|
24
|
+
el: el
|
File without changes
|
File without changes
|
@@ -1,11 +1,9 @@
|
|
1
1
|
.navbar
|
2
2
|
.navbar-inner
|
3
|
-
= link_to
|
3
|
+
= link_to 'Crowdblog', crowdblog.admin_root_path, :class => 'brand'
|
4
4
|
- if current_user
|
5
5
|
ul.nav
|
6
6
|
li.brand= current_user.email
|
7
|
-
li= link_to 'Posts',
|
8
|
-
li= link_to 'Authors',
|
9
|
-
li= link_to 'Sign out',
|
10
|
-
|
11
|
-
|
7
|
+
li= link_to 'Posts', crowdblog.admin_posts_path
|
8
|
+
li= link_to 'Authors', crowdblog.admin_authors_path
|
9
|
+
li= link_to 'Sign out', '#'
|
@@ -1,13 +1,4 @@
|
|
1
|
-
=
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
td.span1
|
6
|
-
- if current_user.is_publisher?
|
7
|
-
= link_to 'Publish', '#', :class => "btn btn-small publish #{(post.published? ? 'btn-success' : 'btn-danger')}"
|
8
|
-
td.span1
|
9
|
-
= link_to 'Review', '#', :class => "btn btn-small review #{(post.ready_for_review ? 'btn-warning' : '')}"
|
10
|
-
td.span1
|
11
|
-
= link_to 'Delete', crowdblog.post_path(post), :method => :delete, :confirm => 'Are you sure?', :class => "btn btn-small"
|
12
|
-
td.span1
|
13
|
-
= link_to 'Edit', crowdblog.edit_post_path(post), :class => "btn btn-small"
|
1
|
+
= div_for post, :class => "span12" do
|
2
|
+
h1= post.title
|
3
|
+
h2= post.author_email
|
4
|
+
.body= post.html_body
|
@@ -1,24 +1 @@
|
|
1
|
-
|
2
|
-
h1 Posts
|
3
|
-
|
4
|
-
.row
|
5
|
-
.span3.new-link
|
6
|
-
= link_to 'New Post', crowdblog.new_post_path, :class => "btn btn-primary btn-small"
|
7
|
-
.span3.offset6
|
8
|
-
ul.nav.nav-pills
|
9
|
-
li class="#{@state ? '' : 'active'}"
|
10
|
-
= link_to 'All', posts_path
|
11
|
-
li class="#{@state == 'published' ? 'active' : ''}"
|
12
|
-
= link_to 'Published', posts_by_state_path('published')
|
13
|
-
li class="#{@state == 'drafted' ? 'active' : ''}"
|
14
|
-
= link_to 'Drafted', posts_by_state_path('drafted')
|
15
|
-
|
16
|
-
#posts.container
|
17
|
-
table.table.table-striped= render @posts
|
18
|
-
|
19
|
-
- content_for :scripts do
|
20
|
-
coffee:
|
21
|
-
$ ->
|
22
|
-
$('tr.post').each (index, el) ->
|
23
|
-
new Crowdblog.Views.PostView
|
24
|
-
el: el
|
1
|
+
= render @posts
|
@@ -0,0 +1,20 @@
|
|
1
|
+
doctype html
|
2
|
+
html
|
3
|
+
head
|
4
|
+
title Crowd Blog
|
5
|
+
= stylesheet_link_tag "//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/css/bootstrap-combined.min.css"
|
6
|
+
= stylesheet_link_tag :crowdblog, media: 'all'
|
7
|
+
= javascript_include_tag "//code.jquery.com/jquery.min.js"
|
8
|
+
= javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.1/underscore-min.js"
|
9
|
+
= javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js"
|
10
|
+
= javascript_include_tag :crowdblog
|
11
|
+
meta name="viewport" content="width=device-width, initial-scale=1.0"
|
12
|
+
= csrf_meta_tags
|
13
|
+
|
14
|
+
= yield :scripts
|
15
|
+
|
16
|
+
body
|
17
|
+
.container
|
18
|
+
.row= render '/crowdblog/application/navbar'
|
19
|
+
.row= render '/crowdblog/application/notices'
|
20
|
+
.row= yield
|