pbw 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Rakefile +3 -1
- data/app/controllers/pbw/application_controller.rb +22 -0
- data/app/controllers/pbw/roles_controller.rb +43 -0
- data/app/models/pbw/ability.rb +13 -0
- data/app/models/pbw/permission.rb +12 -0
- data/app/models/pbw/role.rb +25 -0
- data/app/models/pbw/user.rb +54 -0
- data/config/initializers/devise.rb +5 -0
- data/config/routes.rb +4 -0
- data/lib/generators/pbw/install/USAGE +5 -0
- data/lib/generators/pbw/install/install_generator.rb +38 -0
- data/lib/generators/pbw/install/templates/app.coffee +11 -0
- data/lib/generators/pbw/resource_helpers.rb +55 -0
- data/lib/pbw/engine.rb +7 -1
- data/lib/pbw/version.rb +1 -1
- data/lib/pbw.rb +2 -0
- data/vendor/assets/javascripts/backbone.js +1571 -0
- data/vendor/assets/javascripts/backbone_datalink.js +0 -0
- data/vendor/assets/javascripts/backbone_rails_sync.js +81 -0
- data/vendor/assets/javascripts/underscore.js +1246 -0
- metadata +28 -13
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDI1NDNjNWI0ZTkzMjgzOTZiZjA3MTFhNjFhNzVhMmMxMDhjMjRiNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NmRlZWQ1MmIxOGVlZjE3NGVlNWNiMTQwZDUwMjNjNDFiY2NlYzg0ZQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OGJkNGM5ZDUxZWQ0YTZkY2I4MWRlYjQyYTdiM2U5Y2YwYTM2MDUwMGU0NzBk
|
10
|
+
MmE0OTFkNmFhYzA1YmZiNDg0NTNlZDY4ZjZlYzA0MjljMzMwNmYzMWFiNDQz
|
11
|
+
NzlhOWI1NTM3N2FjMDFlMGI4NGZhYjY4OWU0MTJhYWU5MGMzNDE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjZlNmNmMjlmN2UyNTRkM2M1MTU1MzY4MGZkZGJhYzE3NmI2OTk1MDk2ODE5
|
14
|
+
NTNiYzhmOTk1OWNjYTliZGQ1MjQxMjZhZmM1M2MzZmJlNGMxNWMwMDA0ZDky
|
15
|
+
MjJkNzkxOTU4YTQ2YTczY2EyYTgxMWQyYzExMTc0NmFmZjRiMTA=
|
data/Rakefile
CHANGED
@@ -19,7 +19,9 @@ namespace :backbone do
|
|
19
19
|
task :download_latest do
|
20
20
|
files = {
|
21
21
|
'underscore.js'=>'http://underscorejs.org/underscore.js',
|
22
|
-
'backbone.js' => 'http://backbonejs.org/backbone.js'
|
22
|
+
'backbone.js' => 'http://backbonejs.org/backbone.js',
|
23
|
+
'backbone_datalink.js' => 'https://raw.github.com/codebrew/backbone-rails/master/vendor/assets/javascripts/backbone_datalink.js',
|
24
|
+
'backbone_rails_sync.js' => 'https://raw.github.com/codebrew/backbone-rails/master/vendor/assets/javascripts/backbone_rails_sync.js'
|
23
25
|
}
|
24
26
|
|
25
27
|
vendor_dir = "vendor/assets/javascripts"
|
@@ -1,4 +1,26 @@
|
|
1
1
|
module Pbw
|
2
2
|
class ApplicationController < ActionController::Base
|
3
|
+
|
4
|
+
rescue_from ::CanCan::AccessDenied do |exception|
|
5
|
+
flash[:alert] = "Access denied. You are not authorized to access the requested page."
|
6
|
+
respond_to do |format|
|
7
|
+
format.json {render json: flash[:alert], status: 401}
|
8
|
+
format.html {redirect_to root_path}
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
def self.permission
|
15
|
+
return name = self.name.gsub('Controller','').singularize.split('::').last.constantize.name rescue nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def current_ability
|
19
|
+
@current_ability ||= Ability.new(current_user)
|
20
|
+
end
|
21
|
+
|
22
|
+
def load_permissions
|
23
|
+
@current_permissions = current_user.role.permissions.collect{|i| [i.subject_class, i.action]}
|
24
|
+
end
|
3
25
|
end
|
4
26
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pbw
|
2
|
+
class RolesController < ApplicationController
|
3
|
+
respond_to :json
|
4
|
+
|
5
|
+
before_filter :authenticate_user!
|
6
|
+
before_filter :is_super_admin?
|
7
|
+
|
8
|
+
def index
|
9
|
+
@roles = Role.all.keep_if{|i| i.name != "Super Admin"}
|
10
|
+
render json: @roles
|
11
|
+
end
|
12
|
+
|
13
|
+
def show
|
14
|
+
@role = Role.find(params[:id])
|
15
|
+
@permissions = @role.permissions
|
16
|
+
render json: {role: @role, permissions: @permissions}
|
17
|
+
end
|
18
|
+
|
19
|
+
def edit
|
20
|
+
@role = Role.find(params[:id])
|
21
|
+
@permissions = Permission.all.keep_if{|i| ["Part"].include? i.subject_class}.compact
|
22
|
+
@role_permissions = @role.permissions.collect{|p| p.id}
|
23
|
+
render json: {role: @role, permissions: @permissions, role_permissions: @role_permissions}
|
24
|
+
end
|
25
|
+
|
26
|
+
def update
|
27
|
+
@role = Role.find(params[:id])
|
28
|
+
@role.permissions = []
|
29
|
+
@role.set_permissions(params[:permissions]) if params[:permissions]
|
30
|
+
if @role.save
|
31
|
+
render json: {notice: "Role updated"}
|
32
|
+
return
|
33
|
+
end
|
34
|
+
render 'edit'
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def is_super_admin?
|
40
|
+
redirect_to root_path and return unless current_user.super_admin?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Ability
|
2
|
+
include ::CanCan::Ability
|
3
|
+
|
4
|
+
def initialize(user)
|
5
|
+
user.role.permissions.each do |permission|
|
6
|
+
if permission.subject_class == "all"
|
7
|
+
can permission.action.to_sym, permission.subject_class.to_sym
|
8
|
+
else
|
9
|
+
can permission.action.to_sym, permission.subject_class.constantize
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Pbw
|
2
|
+
class Role
|
3
|
+
include ::Mongoid::Document
|
4
|
+
field :name, type: String
|
5
|
+
attr_accessible :name
|
6
|
+
has_many :users
|
7
|
+
|
8
|
+
validates :name, presence: true, uniqueness: true
|
9
|
+
|
10
|
+
has_and_belongs_to_many :permissions
|
11
|
+
|
12
|
+
def set_permission(subject_class, action)
|
13
|
+
p = Permission.where(subject_class: subject_class, action: action)
|
14
|
+
p = Permission.create(subject_class: subject_class, action: action) unless p
|
15
|
+
self.permissions << p
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_permissions(permissions)
|
19
|
+
permissions.each do |id|
|
20
|
+
permission = Permission.find(id)
|
21
|
+
self.permissions << p
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Pbw
|
2
|
+
class User
|
3
|
+
include ::Mongoid::Document
|
4
|
+
# Include default devise modules. Others available are:
|
5
|
+
# :token_authenticatable, :confirmable,
|
6
|
+
# :lockable, :timeoutable and :omniauthable
|
7
|
+
devise :database_authenticatable, :registerable,
|
8
|
+
:recoverable, :rememberable, :trackable, :validatable
|
9
|
+
|
10
|
+
## Database authenticatable
|
11
|
+
field :email, :type => String, :default => ""
|
12
|
+
field :encrypted_password, :type => String, :default => ""
|
13
|
+
|
14
|
+
## Recoverable
|
15
|
+
field :reset_password_token, :type => String
|
16
|
+
field :reset_password_sent_at, :type => Time
|
17
|
+
|
18
|
+
## Rememberable
|
19
|
+
field :remember_created_at, :type => Time
|
20
|
+
|
21
|
+
## Trackable
|
22
|
+
field :sign_in_count, :type => Integer, :default => 0
|
23
|
+
field :current_sign_in_at, :type => Time
|
24
|
+
field :last_sign_in_at, :type => Time
|
25
|
+
field :current_sign_in_ip, :type => String
|
26
|
+
field :last_sign_in_ip, :type => String
|
27
|
+
|
28
|
+
field :name, :type => String
|
29
|
+
validates_presence_of :name
|
30
|
+
validates_uniqueness_of :name, :email, :case_sensitive => false
|
31
|
+
validates_format_of :email, :with => /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/
|
32
|
+
validates_confirmation_of :password
|
33
|
+
|
34
|
+
belongs_to :role
|
35
|
+
|
36
|
+
## Confirmable
|
37
|
+
field :confirmation_token, :type => String
|
38
|
+
field :confirmed_at, :type => Time
|
39
|
+
field :confirmation_sent_at, :type => Time
|
40
|
+
field :unconfirmed_email, :type => String # Only if using reconfirmable
|
41
|
+
|
42
|
+
## Lockable
|
43
|
+
field :failed_attempts, :type => Integer, :default => 0 # Only if lock strategy is :failed_attempts
|
44
|
+
field :unlock_token, :type => String # Only if unlock strategy is :email or :both
|
45
|
+
field :locked_at, :type => Time
|
46
|
+
|
47
|
+
## Token authenticatable
|
48
|
+
field :authentication_token, :type => String
|
49
|
+
|
50
|
+
def super_admin?
|
51
|
+
self.role.name == "Super Admin"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'generators/pbw/resource_helpers'
|
2
|
+
|
3
|
+
module Pbw
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
include Pbw::Generators::ResourceHelpers
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
8
|
+
|
9
|
+
class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false,
|
10
|
+
:desc => "Skip Git ignores and keeps"
|
11
|
+
|
12
|
+
def inject_backbone
|
13
|
+
inject_into_file "app/assets/javascripts/application.js", :before => "//= require_tree" do
|
14
|
+
"//= require underscore\n//= require backbone\n//= require backbone_rails_sync\n//= require backbone_datalink\n//= require #{application_name.underscore}\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_dir_layout
|
19
|
+
%W{routers models views templates}.each do |dir|
|
20
|
+
empty_directory "app/assets/javascripts/#{dir}"
|
21
|
+
create_file "app/assets/javascripts/#{dir}/.gitkeep" unless options[:skip_git]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_app_file
|
26
|
+
template "app.coffee", "app/assets/javascripts/#{application_name.underscore}.js.coffee"
|
27
|
+
end
|
28
|
+
|
29
|
+
def config_mongoid
|
30
|
+
generate "mongoid:config"
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_engine_routes
|
34
|
+
route "mount Pbw::Engine, :at => '/'"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Pbw
|
2
|
+
module Generators
|
3
|
+
module ResourceHelpers
|
4
|
+
|
5
|
+
def backbone_path
|
6
|
+
"app/assets/javascripts"
|
7
|
+
end
|
8
|
+
|
9
|
+
def model_namespace
|
10
|
+
[js_app_name, "Models", class_name].join(".")
|
11
|
+
end
|
12
|
+
|
13
|
+
def singular_model_name
|
14
|
+
uncapitalize singular_name.camelize
|
15
|
+
end
|
16
|
+
|
17
|
+
def plural_model_name
|
18
|
+
uncapitalize(plural_name.camelize)
|
19
|
+
end
|
20
|
+
|
21
|
+
def collection_namespace
|
22
|
+
[js_app_name, "Collections", plural_name.camelize].join(".")
|
23
|
+
end
|
24
|
+
|
25
|
+
def view_namespace
|
26
|
+
[js_app_name, "Views", plural_name.camelize].join(".")
|
27
|
+
end
|
28
|
+
|
29
|
+
def router_namespace
|
30
|
+
[js_app_name, "Routers", plural_name.camelize].join(".")
|
31
|
+
end
|
32
|
+
|
33
|
+
def jst(action)
|
34
|
+
"templates/#{plural_name}/#{action}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def js_app_name
|
38
|
+
application_name.camelize
|
39
|
+
end
|
40
|
+
|
41
|
+
def application_name
|
42
|
+
if defined?(Rails) && Rails.application
|
43
|
+
Rails.application.class.name.split('::').first
|
44
|
+
else
|
45
|
+
"application"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def uncapitalize(str)
|
50
|
+
str[0, 1].downcase << str[1..-1]
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/pbw/engine.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Pbw
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
isolate_namespace Pbw
|
4
|
+
engine_name 'pbw'
|
5
|
+
|
4
6
|
config.generators do |g|
|
5
7
|
g.orm :mongoid
|
6
8
|
g.template_engine :erb
|
@@ -9,6 +11,10 @@ module Pbw
|
|
9
11
|
g.helper :false
|
10
12
|
g.javascript_engine :coffee
|
11
13
|
end
|
12
|
-
|
14
|
+
|
15
|
+
def self.config(&block)
|
16
|
+
yield Engine.config if block
|
17
|
+
Engine.config
|
18
|
+
end
|
13
19
|
end
|
14
20
|
end
|
data/lib/pbw/version.rb
CHANGED