stiki 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/stylesheets/stiki/spaces.css +22 -0
- data/app/controllers/stiki/spaces_controller.rb +24 -1
- data/app/helpers/stiki/application_helper.rb +3 -1
- data/app/models/stiki/space.rb +7 -1
- data/app/views/stiki/pages/edit.html.erb +1 -1
- data/app/views/stiki/pages/new.html.erb +1 -2
- data/app/views/stiki/spaces/edit.html.erb +39 -0
- data/app/views/stiki/spaces/index.html.erb +58 -53
- data/lib/stiki/authenticate/devise.rb +2 -2
- data/lib/stiki/authorize/cancan.rb +1 -1
- data/lib/stiki/version.rb +1 -1
- data/spec/controllers/stiki/pages_controller_spec.rb +1 -0
- data/spec/helpers/stiki/application_helper_spec.rb +57 -0
- data/spec/lib/authenticate/devise_spec.rb +1 -1
- data/spec/lib/stiki_spec.rb +2 -1
- data/spec/spec_helper.rb +28 -3
- data/test/dummy/log/test.log +30719 -0
- metadata +7 -4
@@ -2,3 +2,25 @@
|
|
2
2
|
Place all the styles related to the matching controller here.
|
3
3
|
They will automatically be included in application.css.
|
4
4
|
*/
|
5
|
+
|
6
|
+
.stiki {
|
7
|
+
.space {
|
8
|
+
.action {
|
9
|
+
float: right;
|
10
|
+
|
11
|
+
.update {
|
12
|
+
margin-right: 5px;
|
13
|
+
}
|
14
|
+
|
15
|
+
.delete {
|
16
|
+
border: 0;
|
17
|
+
background-color: white;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
.title {
|
23
|
+
float: left;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
@@ -8,6 +8,9 @@ module Stiki
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# def show handled by PageController#index
|
11
|
+
def edit
|
12
|
+
@space = Space.find(params[:id])
|
13
|
+
end
|
11
14
|
|
12
15
|
def create
|
13
16
|
@space = Space.new(params[:space])
|
@@ -26,6 +29,26 @@ module Stiki
|
|
26
29
|
redirect_to stiki_routes.spaces_path
|
27
30
|
end
|
28
31
|
|
32
|
+
def update
|
33
|
+
@space = Space.find(params[:id])
|
34
|
+
@space.attributes = params[:space]
|
35
|
+
|
36
|
+
if Stiki.authenticate_by == :devise
|
37
|
+
author = Author.new
|
38
|
+
author.user = self.send( "current_#{Stiki::Helper.user_model_name}".to_sym )
|
39
|
+
@space.authors << author
|
40
|
+
end
|
41
|
+
|
42
|
+
if @space.save
|
43
|
+
flash[:notice] = "Space Updated"
|
44
|
+
|
45
|
+
redirect_to stiki_routes.spaces_path
|
46
|
+
else
|
47
|
+
flash[:error] = "Error creating new Space"
|
48
|
+
render :template => 'stiki/spaces/edit'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
29
52
|
def destroy
|
30
53
|
@space = Space.find( params[:id] )
|
31
54
|
|
@@ -33,7 +56,7 @@ module Stiki
|
|
33
56
|
flash[:error] = "Cannot delete a Wiki Space that has Wiki Pages"
|
34
57
|
else
|
35
58
|
@space.destroy
|
36
|
-
flash[:
|
59
|
+
flash[:notice] = "The Space #{@space.name} has been deleted"
|
37
60
|
end
|
38
61
|
|
39
62
|
redirect_to stiki_routes.spaces_path
|
data/app/models/stiki/space.rb
CHANGED
@@ -6,7 +6,13 @@ module Stiki
|
|
6
6
|
friendly_id :name, use: :slugged
|
7
7
|
|
8
8
|
has_many :pages
|
9
|
-
has_many :authors, :as => :authorable
|
9
|
+
has_many :authors, :as => :authorable do
|
10
|
+
def <<(*authors)
|
11
|
+
# prevent duplicate authors
|
12
|
+
existing_users = proxy_association.owner.authors.map(&:user_id)
|
13
|
+
super( authors.select { |auth| !existing_users.include?( auth.user_id ) } )
|
14
|
+
end
|
15
|
+
end
|
10
16
|
has_one :creator, :class_name => 'Author', :conditions => ["creator = ?", true], :as => :authorable
|
11
17
|
|
12
18
|
attr_accessible :name
|
@@ -1,9 +1,8 @@
|
|
1
1
|
<div class="row-fluid">
|
2
|
-
<div class="
|
2
|
+
<div class="span12">
|
3
3
|
<div class="row-fluid well">
|
4
4
|
<h2>New Page in <%= @space.name %></h2>
|
5
5
|
</div>
|
6
|
-
|
7
6
|
<div class="row-fluid well">
|
8
7
|
<%= form_tag( stiki_routes.space_pages_path(@space), :class => 'form-horizontal' ) do |f| %>
|
9
8
|
<%= render( :partial => 'stiki/pages/form', :locals => { :f => f, :page => @page } ) %>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<div class="stiki row-fluid">
|
2
|
+
<div class="span12">
|
3
|
+
<div class="row-fluid well">
|
4
|
+
<h2>Edit <%= @space.name %></h2>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div class="row-fluid well">
|
8
|
+
<%= form_tag( stiki_routes.space_path(@space), :class => 'form-horizontal', :method => :put) do |f| %>
|
9
|
+
<fieldset>
|
10
|
+
|
11
|
+
<%- if @space.errors %>
|
12
|
+
<div class="control-group error">
|
13
|
+
<%- @space.errors.full_messages.each do |error| %>
|
14
|
+
<div class="error help-block">
|
15
|
+
<%= error %>
|
16
|
+
</div>
|
17
|
+
<% end -%>
|
18
|
+
</div>
|
19
|
+
<% end -%>
|
20
|
+
|
21
|
+
<div class="control-group">
|
22
|
+
<%= label_tag 'name', 'Name', :class => "control-label" %>
|
23
|
+
<div class="controls">
|
24
|
+
<input class="field input-xlarge span11" id="name" name="space[name]" value="<%= @space.name %>" size="30" type="text">
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
<div class="form-actions">
|
28
|
+
<div class="span4">
|
29
|
+
<%= submit_tag "Save", :class => "btn btn-primary btn-large" %>
|
30
|
+
</div>
|
31
|
+
<div class="span2">
|
32
|
+
<%= link_to 'Cancel', stiki_routes.spaces_path(), :class => 'btn' %>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</fieldset>
|
36
|
+
<% end -%>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
@@ -1,57 +1,62 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
<div class='stiki'>
|
2
|
+
<%- @spaces.each do |space| %>
|
3
|
+
<div class="row-fluid">
|
4
|
+
<div class="span8 well space">
|
5
|
+
<div class="action">
|
6
|
+
<%- if has_access( :update, @page ) %>
|
7
|
+
<%= link_to '<i class="icon-pencil"></i>'.html_safe, stiki_routes.edit_space_path( space ), :class => 'update close' %>
|
8
|
+
<% end %>
|
9
|
+
<%- if has_access( :delete, @page ) %>
|
10
|
+
<%= button_to 'x', stiki_routes.space_path( space ), :method => :delete,
|
11
|
+
:class => 'delete close', :confirm => 'Are you sure you want to delete this Wiki Space?' %>
|
12
|
+
<% end -%>
|
13
|
+
</div>
|
14
|
+
<div style="title">
|
15
|
+
<h2 ><%= link_to space.name, stiki_routes.space_pages_path(space) %></h2>
|
16
|
+
<% if space.creator %>
|
17
|
+
<h4 >Created by <%= user_name( space.creator ) %></h4>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
</div>
|
9
21
|
</div>
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
22
|
+
<% end -%>
|
23
|
+
<%- if has_access( :create, Stiki::Space ) %>
|
24
|
+
<%- if javascript_enabled %>
|
25
|
+
<div class="row-fluid create-space">
|
26
|
+
<div class="span8 well">
|
27
|
+
<a href="#" class="create-space-trigger">Create New Space</a>
|
28
|
+
</div>
|
15
29
|
</div>
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
<h2>Create New Space</h2>
|
33
|
-
<div class="control-group">
|
34
|
-
<%= label_tag 'name', 'Name', :class => "control-label" %>
|
35
|
-
<div class="controls">
|
36
|
-
<input class="input-xlarge" id="name" name="space[name]" size="30" type="text">
|
30
|
+
<% end -%>
|
31
|
+
<div class="row-fluid create-space" style="<%= 'display:none' if javascript_enabled %>">
|
32
|
+
<div class="span8">
|
33
|
+
<div class="row-fluid">
|
34
|
+
<%= form_tag( stiki_routes.spaces_path, :class => 'form-horizontal' ) do |f| %>
|
35
|
+
<fieldset class="well">
|
36
|
+
<h2>Create New Space</h2>
|
37
|
+
<div class="control-group">
|
38
|
+
<%= label_tag 'name', 'Name', :class => "control-label" %>
|
39
|
+
<div class="controls">
|
40
|
+
<input class="input-xlarge" id="name" name="space[name]" size="30" type="text">
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
<div class="form-actions">
|
44
|
+
<%= submit_tag "Create", :class => "btn btn-primary btn-large" %>
|
45
|
+
<a href="#" class="create-space-trigger btn">Cancel</a>
|
37
46
|
</div>
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
</div>
|
43
|
-
</fieldset>
|
44
|
-
<% end -%>
|
47
|
+
</fieldset>
|
48
|
+
<% end -%>
|
49
|
+
</div>
|
50
|
+
</div>
|
45
51
|
</div>
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
<% end -%>
|
52
|
+
<%- if javascript_enabled %>
|
53
|
+
<script type="text/javascript">
|
54
|
+
$(function() {
|
55
|
+
$('.create-space-trigger').click( function() {
|
56
|
+
$('.create-space').slideToggle();
|
57
|
+
});
|
58
|
+
});
|
59
|
+
</script>
|
60
|
+
<% end -%>
|
61
|
+
<% end -%>
|
62
|
+
</div>
|
@@ -7,9 +7,9 @@ module Stiki::Authenticate::Devise
|
|
7
7
|
auth_required = Stiki.auth_mapping[base.controller_name.to_sym]
|
8
8
|
if auth_required
|
9
9
|
if auth_required == :all
|
10
|
-
base.before_filter "authenticate_#{Stiki::Helper.user_model_name}!".to_sym
|
10
|
+
base.before_filter "authenticate_#{Stiki::Helper.user_model_name}!".to_sym, :if => lambda {|c| Stiki.authenticate_by == :devise }
|
11
11
|
else
|
12
|
-
base.before_filter "authenticate_#{Stiki::Helper.user_model_name}!".to_sym, auth_required
|
12
|
+
base.before_filter "authenticate_#{Stiki::Helper.user_model_name}!".to_sym, auth_required.merge( :if => lambda {|c| Stiki.authenticate_by == :devise } )
|
13
13
|
end
|
14
14
|
end
|
15
15
|
else
|
data/lib/stiki/version.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stiki/application_helper'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
describe Stiki::ApplicationHelper do
|
6
|
+
it "should expose Stiki routes" do
|
7
|
+
helper.stiki_routes.should eql Stiki::Engine.routes.url_helpers
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should expose Stiki#javascript_enabled as javascript_enabled" do
|
11
|
+
Stiki.javascript_enabled = false
|
12
|
+
helper.javascript_enabled.should be_false
|
13
|
+
|
14
|
+
Stiki.javascript_enabled = true
|
15
|
+
helper.javascript_enabled.should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should get user_name for user" do
|
19
|
+
Stiki.user_name_via = :name
|
20
|
+
|
21
|
+
author = OpenStruct.new
|
22
|
+
author.user = OpenStruct.new( :name => 'test' )
|
23
|
+
|
24
|
+
helper.user_name( author ).should eql 'test'
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#has_access" do
|
28
|
+
before do
|
29
|
+
view.stub!(:current_user).and_return( Author.new )
|
30
|
+
end
|
31
|
+
|
32
|
+
context "disabled" do
|
33
|
+
before do
|
34
|
+
Stiki.authorize_by = false
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should always be true" do
|
38
|
+
helper.has_access(:action, nil ).should be_true
|
39
|
+
helper.has_access(nil, Author.new ).should be_true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "enabled" do
|
44
|
+
before do
|
45
|
+
Stiki.authorize_by = :cancan
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be authorized for index" do
|
49
|
+
helper.has_access(:index, Stiki::Author ).should be_true
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not be authorized for create" do
|
53
|
+
helper.has_access(:create, Stiki::Author ).should be_false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -9,7 +9,7 @@ describe Stiki::Authenticate::Devise do
|
|
9
9
|
stiki.authenticate_by = :devise
|
10
10
|
stiki.user_class = 'Author'
|
11
11
|
stiki.authenticate_pages = :all
|
12
|
-
stiki.authenticate_spaces = [:new, :create, :edit, :update]
|
12
|
+
stiki.authenticate_spaces = {:only => [:new, :create, :edit, :update]}
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
data/spec/lib/stiki_spec.rb
CHANGED
@@ -9,6 +9,7 @@ describe Stiki do
|
|
9
9
|
Stiki.config do |stiki|
|
10
10
|
stiki.authenticate_by = :devise
|
11
11
|
stiki.user_class = 'Author'
|
12
|
+
stiki.user_name_via = :to_s
|
12
13
|
stiki.authenticate_pages = {:only => [:blue, :green, :orange ] }
|
13
14
|
stiki.authenticate_spaces = {:only => [:new, :create, :edit, :update] }
|
14
15
|
end
|
@@ -18,7 +19,7 @@ describe Stiki do
|
|
18
19
|
Stiki.authenticate_by.should eql :devise
|
19
20
|
end
|
20
21
|
|
21
|
-
it "should set
|
22
|
+
it "should set user_name_via" do
|
22
23
|
Stiki.user_name_via.should eql :to_s
|
23
24
|
end
|
24
25
|
|
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,7 @@ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
|
|
4
4
|
require 'rspec/rails'
|
5
5
|
require 'rspec/autorun'
|
6
6
|
require 'shoulda-matchers'
|
7
|
+
require 'cancan'
|
7
8
|
|
8
9
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
9
10
|
# in spec/support/ and its subdirectories.
|
@@ -38,8 +39,7 @@ RSpec.configure do |config|
|
|
38
39
|
# order dependency and want to debug it, you can fix the order by providing
|
39
40
|
# the seed, which is printed after each run.
|
40
41
|
# --seed 1234
|
41
|
-
config.order = "random"
|
42
|
-
|
42
|
+
# config.order = "random"
|
43
43
|
|
44
44
|
config.include FactoryGirl::Syntax::Methods
|
45
45
|
end
|
@@ -49,6 +49,27 @@ class Author < ActiveRecord::Base
|
|
49
49
|
self.table_name = "stiki_authors"
|
50
50
|
end
|
51
51
|
|
52
|
+
class Ability
|
53
|
+
include CanCan::Ability
|
54
|
+
|
55
|
+
def initialize(user)
|
56
|
+
# Define abilities for the passed in user here. For example:
|
57
|
+
#
|
58
|
+
author ||= Author.new # guest user (not logged in)
|
59
|
+
|
60
|
+
can :manage, Stiki::Page
|
61
|
+
can :manage, Stiki::Space
|
62
|
+
can :index, Stiki::Author
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class ActionView::TestCase::TestController
|
68
|
+
def current_user
|
69
|
+
Author.new
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
52
73
|
|
53
74
|
# Shim the Stiki ApplicationController to get access to the filters
|
54
75
|
# and stub the devise before_filter method
|
@@ -67,11 +88,15 @@ class Stiki::ApplicationController
|
|
67
88
|
end
|
68
89
|
|
69
90
|
def current_author
|
70
|
-
|
91
|
+
Author.new
|
71
92
|
end
|
72
93
|
|
73
94
|
def authenticate_author!
|
74
95
|
|
75
96
|
end
|
97
|
+
|
98
|
+
def current_ability
|
99
|
+
@current_ability ||= Ability.new(current_author)
|
100
|
+
end
|
76
101
|
|
77
102
|
end
|