padrino-admin 0.9.6 → 0.9.7
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/README.rdoc +3 -3
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/padrino-admin.rb +6 -6
- data/lib/padrino-admin/access_control.rb +23 -15
- data/lib/padrino-admin/generators/actions.rb +4 -12
- data/lib/padrino-admin/generators/admin_page.rb +3 -4
- data/lib/padrino-admin/generators/templates/account/activerecord.rb.tt +2 -2
- data/lib/padrino-admin/generators/templates/account/datamapper.rb.tt +2 -2
- data/lib/padrino-admin/generators/templates/account/mongoid.rb.tt +2 -2
- data/lib/padrino-admin/generators/templates/account/mongomapper.rb.tt +2 -2
- data/lib/padrino-admin/generators/templates/account/seeds.rb.tt +2 -2
- data/lib/padrino-admin/generators/templates/app/app.rb +2 -2
- data/lib/padrino-admin/generators/templates/app/controllers/base.rb +0 -1
- data/lib/padrino-admin/generators/templates/erb/app/base/index.erb.tt +1 -1
- data/lib/padrino-admin/generators/templates/erb/app/layouts/application.erb.tt +2 -2
- data/lib/padrino-admin/generators/templates/erb/app/sessions/new.erb.tt +4 -4
- data/lib/padrino-admin/generators/templates/haml/app/base/_sidebar.haml.tt +1 -1
- data/lib/padrino-admin/generators/templates/haml/app/base/index.haml.tt +4 -4
- data/lib/padrino-admin/generators/templates/haml/app/layouts/application.haml.tt +1 -1
- data/lib/padrino-admin/generators/templates/haml/page/index.haml.tt +1 -1
- data/lib/padrino-admin/helpers/authentication_helpers.rb +12 -12
- data/lib/padrino-admin/helpers/view_helpers.rb +10 -10
- data/lib/padrino-admin/locale/orm/de.yml +1 -1
- data/lib/padrino-admin/utils/crypt.rb +11 -6
- data/padrino-admin.gemspec +11 -11
- data/test/fixtures/data_mapper.rb +4 -4
- data/test/generators/test_admin_app_generator.rb +1 -1
- data/test/generators/test_admin_page_generator.rb +1 -1
- data/test/helper.rb +3 -4
- metadata +9 -9
data/README.rdoc
CHANGED
|
@@ -12,7 +12,7 @@ Access Control:: Supports authentication and role permissions for your applicati
|
|
|
12
12
|
|
|
13
13
|
=== Admin Dashboard Usage
|
|
14
14
|
|
|
15
|
-
For a complete look at usage of the Admin dashboard functionality, be sure to check out the
|
|
15
|
+
For a complete look at usage of the Admin dashboard functionality, be sure to check out the
|
|
16
16
|
{Padrino Admin}[http://wiki.github.com/padrino/padrino-framework/padrino-admin] guide.
|
|
17
17
|
|
|
18
18
|
Create a new project:
|
|
@@ -38,7 +38,7 @@ To create a new "scaffold" you need to provide only a Model name to the command:
|
|
|
38
38
|
demo$ padrino-gen rake dm:auto:migrate
|
|
39
39
|
demo$ padrino-gen admin_page post
|
|
40
40
|
demo$ padrino start # and go to http://localhost:3000/admin
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
That's all!!
|
|
43
43
|
|
|
44
44
|
=== Admin Access Control
|
|
@@ -62,7 +62,7 @@ by the admin access control features:
|
|
|
62
62
|
In this example +if+ we visit urls that start with /+customer+/+orders+ or /+cart/checkout+ we will be redirected
|
|
63
63
|
to our :+login_page+ "/login". Once we are correctly logged in we can visit these pages.
|
|
64
64
|
|
|
65
|
-
For a more complete look at using the Admin panel functionality and access features, be sure to check out the
|
|
65
|
+
For a more complete look at using the Admin panel functionality and access features, be sure to check out the
|
|
66
66
|
{Padrino Admin}[http://wiki.github.com/padrino/padrino-framework/padrino-admin] guide.
|
|
67
67
|
|
|
68
68
|
== Copyright
|
data/Rakefile
CHANGED
|
@@ -33,7 +33,7 @@ end
|
|
|
33
33
|
require 'rake/testtask'
|
|
34
34
|
Rake::TestTask.new(:test) do |test|
|
|
35
35
|
test.libs << 'test'
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
test.pattern = 'test/**/test_*.rb'
|
|
38
38
|
test.verbose = true
|
|
39
39
|
end
|
|
@@ -67,7 +67,7 @@ Rake::RDocTask.new do |rdoc|
|
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
|
|
70
|
-
spec = Gem::Specification.new do |s|
|
|
70
|
+
spec = Gem::Specification.new do |s|
|
|
71
71
|
s.name = "foo"
|
|
72
72
|
s.version = "1.0.1"
|
|
73
73
|
s.author = "Davide D'Agostino"
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.7
|
data/lib/padrino-admin.rb
CHANGED
|
@@ -8,31 +8,31 @@ Dir[File.dirname(__FILE__) + '/padrino-admin/{helpers,utils}/*.rb'].each { |file
|
|
|
8
8
|
module Padrino
|
|
9
9
|
##
|
|
10
10
|
# Padrino::Admin is beautiful Ajax Admin, with these fatures:
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
# Orm Agnostic:: Adapters for datamapper, activerecord, mongomapper, couchdb (now only: datamapper and activerecord)
|
|
13
13
|
# Authentication:: Support for Account authentication, Account Permission managment
|
|
14
14
|
# Scaffold:: You can simply create a new "admin interface" simply providing a Model
|
|
15
15
|
# Ajax Uploads:: You can upload file, manage them and attach them to any model in a quick and simple way (coming soon)
|
|
16
|
-
#
|
|
16
|
+
#
|
|
17
17
|
module Admin; end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
##
|
|
21
21
|
# We need to apply Padrino::Admin::Utils::Extensions
|
|
22
|
-
#
|
|
22
|
+
#
|
|
23
23
|
String.send(:include, Padrino::Admin::Utils::Crypt)
|
|
24
24
|
|
|
25
25
|
##
|
|
26
26
|
# We need to add to Padrino::Application a +access_control+ class
|
|
27
|
-
#
|
|
27
|
+
#
|
|
28
28
|
Padrino::Application.extend(Padrino::Admin::AccessControl::ClassMethods)
|
|
29
29
|
|
|
30
30
|
##
|
|
31
31
|
# Load our Padrino::Admin locales
|
|
32
|
-
#
|
|
32
|
+
#
|
|
33
33
|
I18n.load_path += Dir["#{File.dirname(__FILE__)}/padrino-admin/locale/**/*.yml"]
|
|
34
34
|
|
|
35
35
|
##
|
|
36
36
|
# Now we need to add admin generators to padrino-gen
|
|
37
|
-
#
|
|
37
|
+
#
|
|
38
38
|
Padrino::Generators.load_paths << Dir[File.dirname(__FILE__) + '/padrino-admin/generators/{actions,orm,admin_app,admin_page}.rb']
|
|
@@ -8,7 +8,7 @@ module Padrino
|
|
|
8
8
|
module AccessControl
|
|
9
9
|
##
|
|
10
10
|
# Method used by Padrino::Application when we register the extension
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
def self.registered(app)
|
|
13
13
|
app.set :session_id, "_padrino_#{File.basename(Padrino.root)}_#{app.app_name}".to_sym
|
|
14
14
|
app.helpers Padrino::Admin::Helpers::AuthenticationHelpers
|
|
@@ -18,9 +18,17 @@ module Padrino
|
|
|
18
18
|
|
|
19
19
|
module ClassMethods #:nodoc:
|
|
20
20
|
def inherited(base)
|
|
21
|
-
base.
|
|
22
|
-
|
|
21
|
+
unless base.respond_to?(:access_control)
|
|
22
|
+
base.send(:cattr_accessor, :access_control)
|
|
23
|
+
base.send(:access_control=, Padrino::Admin::AccessControl::Base.new)
|
|
24
|
+
end
|
|
23
25
|
super(base)
|
|
26
|
+
base.class_eval { class << self; alias_method_chain :reload!, :access_control; end }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def reload_with_access_control!
|
|
30
|
+
self.access_control = Padrino::Admin::AccessControl::Base.new
|
|
31
|
+
reload_without_access_control!
|
|
24
32
|
end
|
|
25
33
|
end
|
|
26
34
|
|
|
@@ -30,7 +38,7 @@ module Padrino
|
|
|
30
38
|
end
|
|
31
39
|
##
|
|
32
40
|
# We map project modules for a given role or roles
|
|
33
|
-
#
|
|
41
|
+
#
|
|
34
42
|
def roles_for(*roles, &block)
|
|
35
43
|
raise Padrino::Admin::AccessControlError, "You must define an Account Model!" unless defined?(Account)
|
|
36
44
|
raise Padrino::Admin::AccessControlError, "Role #{role} must be present and must be a symbol!" if roles.any? { |r| !r.kind_of?(Symbol) } || roles.empty?
|
|
@@ -42,14 +50,14 @@ module Padrino
|
|
|
42
50
|
|
|
43
51
|
##
|
|
44
52
|
# Return an array of roles
|
|
45
|
-
#
|
|
53
|
+
#
|
|
46
54
|
def roles
|
|
47
55
|
@roles.uniq.reject { |r| r == :any }
|
|
48
56
|
end
|
|
49
57
|
|
|
50
58
|
##
|
|
51
59
|
# Return an array of project_modules
|
|
52
|
-
#
|
|
60
|
+
#
|
|
53
61
|
def project_modules(account)
|
|
54
62
|
role = account.role.to_sym rescue :any
|
|
55
63
|
authorizations = @authorizations.find_all { |auth| auth.roles.include?(role) }
|
|
@@ -58,7 +66,7 @@ module Padrino
|
|
|
58
66
|
|
|
59
67
|
##
|
|
60
68
|
# Return true if the given account is allowed to see the given path.
|
|
61
|
-
#
|
|
69
|
+
#
|
|
62
70
|
def allowed?(account=nil, path=nil)
|
|
63
71
|
path = "/" if path.blank?
|
|
64
72
|
role = account.role.to_sym rescue nil
|
|
@@ -92,21 +100,21 @@ module Padrino
|
|
|
92
100
|
|
|
93
101
|
##
|
|
94
102
|
# Allow a specified path
|
|
95
|
-
#
|
|
103
|
+
#
|
|
96
104
|
def allow(path)
|
|
97
105
|
@allowed << path unless @allowed.include?(path)
|
|
98
106
|
end
|
|
99
107
|
|
|
100
108
|
##
|
|
101
109
|
# Protect access from
|
|
102
|
-
#
|
|
110
|
+
#
|
|
103
111
|
def protect(path)
|
|
104
112
|
@denied << path unless @denied.include?(path)
|
|
105
113
|
end
|
|
106
114
|
|
|
107
115
|
##
|
|
108
116
|
# Create a project module
|
|
109
|
-
#
|
|
117
|
+
#
|
|
110
118
|
def project_module(name, path)
|
|
111
119
|
allow(path)
|
|
112
120
|
@project_modules << ProjectModule.new(name, path)
|
|
@@ -115,7 +123,7 @@ module Padrino
|
|
|
115
123
|
|
|
116
124
|
##
|
|
117
125
|
# Project Module class
|
|
118
|
-
#
|
|
126
|
+
#
|
|
119
127
|
class ProjectModule
|
|
120
128
|
attr_reader :name
|
|
121
129
|
|
|
@@ -125,21 +133,21 @@ module Padrino
|
|
|
125
133
|
|
|
126
134
|
##
|
|
127
135
|
# Returns the name of the project module. If a symbol it translate/humanize them for you.
|
|
128
|
-
#
|
|
136
|
+
#
|
|
129
137
|
def human_name
|
|
130
138
|
@name.is_a?(Symbol) ? I18n.t("padrino.admin.menu.#{@name}", :default => @name.to_s.humanize) : @name
|
|
131
139
|
end
|
|
132
140
|
|
|
133
141
|
##
|
|
134
142
|
# Return the path of the project module. If a prefix given will be prepended.
|
|
135
|
-
#
|
|
143
|
+
#
|
|
136
144
|
# ==== Examples
|
|
137
|
-
#
|
|
145
|
+
#
|
|
138
146
|
# # => /accounts/new
|
|
139
147
|
# project_module.path
|
|
140
148
|
# # => /admin/accounts
|
|
141
149
|
# project_module.path("/admin")
|
|
142
|
-
#
|
|
150
|
+
#
|
|
143
151
|
def path(prefix=nil)
|
|
144
152
|
prefix ? File.join(prefix, @path) : @path
|
|
145
153
|
end
|
|
@@ -4,7 +4,7 @@ module Padrino
|
|
|
4
4
|
module Actions
|
|
5
5
|
##
|
|
6
6
|
# Tell us which orm we are using
|
|
7
|
-
#
|
|
7
|
+
#
|
|
8
8
|
def orm
|
|
9
9
|
fetch_component_choice(:orm).to_sym rescue :datamapper
|
|
10
10
|
end
|
|
@@ -12,26 +12,18 @@ module Padrino
|
|
|
12
12
|
|
|
13
13
|
##
|
|
14
14
|
# Tell us for now wich orm we support
|
|
15
|
-
#
|
|
15
|
+
#
|
|
16
16
|
def supported_orm
|
|
17
17
|
[:datamapper, :activerecord, :mongomapper, :mongoid]
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
##
|
|
21
21
|
# Add access_control permission in our app.rb
|
|
22
|
-
#
|
|
22
|
+
#
|
|
23
23
|
def add_project_module(controller)
|
|
24
|
-
permission =
|
|
24
|
+
permission = " role.project_module :#{controller}, \"/#{controller}\"\n"
|
|
25
25
|
inject_into_file destination_root("/admin/app.rb"), permission, :after => "access_control.roles_for :admin do |role, account|\n"
|
|
26
26
|
end
|
|
27
|
-
|
|
28
|
-
##
|
|
29
|
-
# Indent a content/string for the given spaces
|
|
30
|
-
#
|
|
31
|
-
def indent(count, content)
|
|
32
|
-
indent = ' ' * count
|
|
33
|
-
content.lines.map { |line| line != "\n" ? indent+line : "\n" }.join
|
|
34
|
-
end
|
|
35
27
|
end # Actions
|
|
36
28
|
end # Admin
|
|
37
29
|
end # Generators
|
|
@@ -17,7 +17,7 @@ class Account < ActiveRecord::Base
|
|
|
17
17
|
|
|
18
18
|
##
|
|
19
19
|
# This method is for authentication purpose
|
|
20
|
-
#
|
|
20
|
+
#
|
|
21
21
|
def self.authenticate(email, password)
|
|
22
22
|
account = first(:conditions => { :email => email }) if email.present?
|
|
23
23
|
account && account.password_clean == password ? account : nil
|
|
@@ -25,7 +25,7 @@ class Account < ActiveRecord::Base
|
|
|
25
25
|
|
|
26
26
|
##
|
|
27
27
|
# This method is used for retrive the original password.
|
|
28
|
-
#
|
|
28
|
+
#
|
|
29
29
|
def password_clean
|
|
30
30
|
crypted_password.decrypt(salt)
|
|
31
31
|
end
|
|
@@ -28,7 +28,7 @@ class Account
|
|
|
28
28
|
|
|
29
29
|
##
|
|
30
30
|
# This method is for authentication purpose
|
|
31
|
-
#
|
|
31
|
+
#
|
|
32
32
|
def self.authenticate(email, password)
|
|
33
33
|
account = first(:conditions => { :email => email }) if email.present?
|
|
34
34
|
account && account.password_clean == password ? account : nil
|
|
@@ -43,7 +43,7 @@ class Account
|
|
|
43
43
|
|
|
44
44
|
##
|
|
45
45
|
# This method is used for retrive the original password.
|
|
46
|
-
#
|
|
46
|
+
#
|
|
47
47
|
def password_clean
|
|
48
48
|
crypted_password.decrypt(salt)
|
|
49
49
|
end
|
|
@@ -26,7 +26,7 @@ class Account
|
|
|
26
26
|
|
|
27
27
|
##
|
|
28
28
|
# This method is for authentication purpose
|
|
29
|
-
#
|
|
29
|
+
#
|
|
30
30
|
def self.authenticate(email, password)
|
|
31
31
|
account = first(:conditions => { :email => email }) if email.present?
|
|
32
32
|
account && account.password_clean == password ? account : nil
|
|
@@ -41,7 +41,7 @@ class Account
|
|
|
41
41
|
|
|
42
42
|
##
|
|
43
43
|
# This method is used for retrive the original password.
|
|
44
|
-
#
|
|
44
|
+
#
|
|
45
45
|
def password_clean
|
|
46
46
|
crypted_password.decrypt(salt)
|
|
47
47
|
end
|
|
@@ -26,7 +26,7 @@ class Account
|
|
|
26
26
|
|
|
27
27
|
##
|
|
28
28
|
# This method is for authentication purpose
|
|
29
|
-
#
|
|
29
|
+
#
|
|
30
30
|
def self.authenticate(email, password)
|
|
31
31
|
account = first(:email => email) if email.present?
|
|
32
32
|
account && account.password_clean == password ? account : nil
|
|
@@ -34,7 +34,7 @@ class Account
|
|
|
34
34
|
|
|
35
35
|
##
|
|
36
36
|
# This method is used for retrive the original password.
|
|
37
|
-
#
|
|
37
|
+
#
|
|
38
38
|
def password_clean
|
|
39
39
|
crypted_password.decrypt(salt)
|
|
40
40
|
end
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Seed add you the ability to populate your db.
|
|
2
2
|
# We provide you a basic shell for interaction with the end user.
|
|
3
3
|
# So try some code like below:
|
|
4
|
-
#
|
|
4
|
+
#
|
|
5
5
|
# name = shell.ask("What's your name?")
|
|
6
6
|
# shell.say name
|
|
7
|
-
#
|
|
7
|
+
#
|
|
8
8
|
email = shell.ask "Which email do you want use for loggin into admin?"
|
|
9
9
|
password = shell.ask "Tell me the password to use:"
|
|
10
10
|
|
|
@@ -2,7 +2,7 @@ class Admin < Padrino::Application
|
|
|
2
2
|
configure do
|
|
3
3
|
##
|
|
4
4
|
# Application-specific configuration options
|
|
5
|
-
#
|
|
5
|
+
#
|
|
6
6
|
# set :raise_errors, true # Show exceptions (default for development)
|
|
7
7
|
# set :public, "foo/bar" # Location for static assets (default root/public)
|
|
8
8
|
# set :sessions, false # Enabled by default
|
|
@@ -14,7 +14,7 @@ class Admin < Padrino::Application
|
|
|
14
14
|
# disable :flash # Disables rack-flash (enabled by default)
|
|
15
15
|
# enable :authentication # Enable padrino-admin authentication (disabled by default)
|
|
16
16
|
# layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application)
|
|
17
|
-
#
|
|
17
|
+
#
|
|
18
18
|
enable :authentication
|
|
19
19
|
disable :store_location
|
|
20
20
|
set :login_page, "/admin/sessions/new"
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<%% end %>
|
|
23
23
|
</ul>
|
|
24
24
|
</div>
|
|
25
|
-
</div>
|
|
25
|
+
</div>
|
|
26
26
|
<div id="wrapper" class="wat-cf">
|
|
27
27
|
<div class="flash">
|
|
28
28
|
<%%= [:error, :warning, :notice].map { |type| flash_tag(type, :class => "message #{type}") }.join %>
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
<div id="sidebar">
|
|
39
39
|
<%%= yield_content :sidebar %>
|
|
40
40
|
</div>
|
|
41
|
-
</div>
|
|
41
|
+
</div>
|
|
42
42
|
</div>
|
|
43
43
|
</body>
|
|
44
44
|
</html>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<div id="box">
|
|
11
11
|
<h1><%= options[:name] %></h1>
|
|
12
12
|
<div class="block" id="block-login">
|
|
13
|
-
<h2>Login Box</h2>
|
|
13
|
+
<h2>Login Box</h2>
|
|
14
14
|
<div class="content login">
|
|
15
15
|
<div class="flash">
|
|
16
16
|
<%%= [:error, :warning, :notice].map { |type| flash_tag(type, :class => "message #{type}") }.join %>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
</div>
|
|
23
23
|
<div class="right">
|
|
24
24
|
<%%= text_field_tag :email, :value => params[:email], :class => 'text_field' %>
|
|
25
|
-
</div>
|
|
25
|
+
</div>
|
|
26
26
|
</div>
|
|
27
27
|
<div class="group wat-cf">
|
|
28
28
|
<div class="left">
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
</div>
|
|
31
31
|
<div class="right">
|
|
32
32
|
<%%= password_field_tag :password, :value => params[:password], :class => 'text_field' %>
|
|
33
|
-
</div>
|
|
33
|
+
</div>
|
|
34
34
|
</div>
|
|
35
35
|
<div class="group navform wat-cf">
|
|
36
36
|
<div class="right">
|
|
37
37
|
<%%= submit_tag "Sign in", :class => :button %>
|
|
38
38
|
</div>
|
|
39
|
-
</div>
|
|
39
|
+
</div>
|
|
40
40
|
<%% end %>
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
%h3 Simple Block
|
|
3
3
|
.content
|
|
4
4
|
%p
|
|
5
|
-
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
5
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
6
6
|
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
7
7
|
.block
|
|
8
8
|
%h3 Links
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
%h2.title Dashboard
|
|
4
4
|
.inner
|
|
5
5
|
%p.first
|
|
6
|
-
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
7
|
-
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
6
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
7
|
+
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
8
8
|
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
9
9
|
%span.hightlight
|
|
10
10
|
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore
|
|
17
17
|
%hr
|
|
18
18
|
%p
|
|
19
|
-
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
20
|
-
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
19
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
20
|
+
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
|
21
21
|
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
22
22
|
%span.hightlight
|
|
23
23
|
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
%td<%= ".first" if i==0 %>=<%= @orm.name_singular %>.<%= column.name %>
|
|
21
21
|
<%- end -%>
|
|
22
22
|
%td.last
|
|
23
|
-
=button_to pat(:edit), url(:<%= @orm.name_plural %>, :edit, :id => <%= @orm.name_singular %>.id), :method => :get, :class => :button_to
|
|
23
|
+
=button_to pat(:edit), url(:<%= @orm.name_plural %>, :edit, :id => <%= @orm.name_singular %>.id), :method => :get, :class => :button_to
|
|
24
24
|
="|"
|
|
25
25
|
=button_to pat(:delete), url(:<%= @orm.name_plural %>, :destroy, :id => <%= @orm.name_singular %>.id), :method => :delete, :class => :button_to
|
|
26
26
|
.actions-bar.wat-cf
|
|
@@ -4,25 +4,25 @@ module Padrino
|
|
|
4
4
|
module AuthenticationHelpers
|
|
5
5
|
##
|
|
6
6
|
# Returns true if +current_account+ is logged and active.
|
|
7
|
-
#
|
|
7
|
+
#
|
|
8
8
|
def logged_in?
|
|
9
9
|
!current_account.nil?
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
##
|
|
13
13
|
# Returns the current_account, it's an instance of <tt>Account</tt> model
|
|
14
|
-
#
|
|
14
|
+
#
|
|
15
15
|
def current_account
|
|
16
16
|
@current_account ||= login_from_session
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
##
|
|
20
20
|
# Override the current_account, you must provide an instance of Account Model
|
|
21
|
-
#
|
|
21
|
+
#
|
|
22
22
|
# ==== Examples:
|
|
23
|
-
#
|
|
23
|
+
#
|
|
24
24
|
# set_current_account(Account.authenticate(params[:email], params[:password])
|
|
25
|
-
#
|
|
25
|
+
#
|
|
26
26
|
def set_current_account(account=nil)
|
|
27
27
|
session[options.session_id] = account ? account.id : nil
|
|
28
28
|
@current_account = account
|
|
@@ -30,16 +30,16 @@ module Padrino
|
|
|
30
30
|
|
|
31
31
|
##
|
|
32
32
|
# Returns true if the +current_account+ is allowed to see the requested path
|
|
33
|
-
#
|
|
33
|
+
#
|
|
34
34
|
# For configure this role please refer to: +Padrino::Admin::AccessControl::Base+
|
|
35
|
-
#
|
|
35
|
+
#
|
|
36
36
|
def allowed?
|
|
37
37
|
access_control.allowed?(current_account, request.path_info)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
##
|
|
41
41
|
# Returns project modules for the current account
|
|
42
|
-
#
|
|
42
|
+
#
|
|
43
43
|
def project_modules
|
|
44
44
|
access_control.project_modules(current_account)
|
|
45
45
|
end
|
|
@@ -47,9 +47,9 @@ module Padrino
|
|
|
47
47
|
##
|
|
48
48
|
# Returns a helper useful in a +before_filter+ for check if
|
|
49
49
|
# an account are: +logged_in?+ and +allowed?+
|
|
50
|
-
#
|
|
50
|
+
#
|
|
51
51
|
# By default this method is used in Admin Apps.
|
|
52
|
-
#
|
|
52
|
+
#
|
|
53
53
|
def login_required
|
|
54
54
|
store_location! if store_location
|
|
55
55
|
return access_denied unless allowed?
|
|
@@ -57,7 +57,7 @@ module Padrino
|
|
|
57
57
|
|
|
58
58
|
##
|
|
59
59
|
# Store in session[:return_to] the env['HTTP_REFERER']
|
|
60
|
-
#
|
|
60
|
+
#
|
|
61
61
|
def store_location!
|
|
62
62
|
session[:return_to] = env['HTTP_REFERER']
|
|
63
63
|
end
|
|
@@ -65,7 +65,7 @@ module Padrino
|
|
|
65
65
|
##
|
|
66
66
|
# Redirect the account to the page that requested an authentication or
|
|
67
67
|
# if the account is not allowed/logged return it to a default page
|
|
68
|
-
#
|
|
68
|
+
#
|
|
69
69
|
def redirect_back_or_default(default)
|
|
70
70
|
return_to = session.delete(:return_to)
|
|
71
71
|
redirect(return_to || default)
|
|
@@ -4,15 +4,15 @@ module Padrino
|
|
|
4
4
|
module ViewHelpers
|
|
5
5
|
##
|
|
6
6
|
# Translate a given word for padrino admin
|
|
7
|
-
#
|
|
7
|
+
#
|
|
8
8
|
# ==== Examples
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# # => t("padrino.admin.profile", :default => "Profile")
|
|
11
11
|
# pat(:profile)
|
|
12
|
-
#
|
|
12
|
+
#
|
|
13
13
|
# # => t("padrino.admin.profile", :default => "My Profile")
|
|
14
14
|
# pat(:profile, "My Profile")
|
|
15
|
-
#
|
|
15
|
+
#
|
|
16
16
|
def padrino_admin_translate(word, default=nil)
|
|
17
17
|
t("padrino.admin.#{word}", :default => (default || word.to_s.humanize))
|
|
18
18
|
end
|
|
@@ -20,12 +20,12 @@ module Padrino
|
|
|
20
20
|
|
|
21
21
|
##
|
|
22
22
|
# Translate attribute name for the given model
|
|
23
|
-
#
|
|
23
|
+
#
|
|
24
24
|
# ==== Examples
|
|
25
|
-
#
|
|
25
|
+
#
|
|
26
26
|
# # => t("models.account.email", :default => "Email")
|
|
27
27
|
# mat(:account, :email)
|
|
28
|
-
#
|
|
28
|
+
#
|
|
29
29
|
def model_attribute_translate(model, attribute)
|
|
30
30
|
t("models.#{model}.attributes.#{attribute}", :default => attribute.to_s.humanize)
|
|
31
31
|
end
|
|
@@ -33,12 +33,12 @@ module Padrino
|
|
|
33
33
|
|
|
34
34
|
##
|
|
35
35
|
# Translate model name
|
|
36
|
-
#
|
|
36
|
+
#
|
|
37
37
|
# ==== Examples
|
|
38
|
-
#
|
|
38
|
+
#
|
|
39
39
|
# # => t("models.account.name", :default => "Account")
|
|
40
40
|
# mt(:account)
|
|
41
|
-
#
|
|
41
|
+
#
|
|
42
42
|
def model_translate(model)
|
|
43
43
|
t("models.#{model}.name", :default => model.to_s.humanize)
|
|
44
44
|
end
|
|
@@ -5,7 +5,7 @@ de:
|
|
|
5
5
|
inclusion: "ist nicht in der Liste enthalten"
|
|
6
6
|
exclusion: "ist reserviert"
|
|
7
7
|
invalid: "ist ung¸ltig"
|
|
8
|
-
confirmation: "entspricht nicht der Best‰tigung"
|
|
8
|
+
confirmation: "entspricht nicht der Best‰tigung"
|
|
9
9
|
accepted: "muss akzeptiert werden"
|
|
10
10
|
empty: "Darf nicht leer sein"
|
|
11
11
|
blank: "Darf nicht nur Leerzeichen sein"
|
|
@@ -3,17 +3,23 @@ require 'openssl'
|
|
|
3
3
|
module Padrino
|
|
4
4
|
module Admin
|
|
5
5
|
module Utils
|
|
6
|
+
##
|
|
6
7
|
# This util it's used for encrypt/decrypt password.
|
|
7
8
|
# We want password decryptable because generally for our sites we have: password_lost.
|
|
8
9
|
# We prefer send original password instead reset them.
|
|
10
|
+
#
|
|
9
11
|
module Crypt
|
|
10
|
-
|
|
12
|
+
##
|
|
13
|
+
# Decrypts the current string using the current key specified
|
|
14
|
+
#
|
|
11
15
|
def decrypt(password)
|
|
12
16
|
cipher = build_cipher(:decrypt, password)
|
|
13
17
|
cipher.update(self.unpack('m')[0]) + cipher.final
|
|
14
18
|
end
|
|
15
19
|
|
|
20
|
+
##
|
|
16
21
|
# Encrypts the current string using the current key and algorithm specified
|
|
22
|
+
#
|
|
17
23
|
def encrypt(password)
|
|
18
24
|
cipher = build_cipher(:encrypt, password)
|
|
19
25
|
[cipher.update(self) + cipher.final].pack('m').chomp
|
|
@@ -25,8 +31,7 @@ module Padrino
|
|
|
25
31
|
cipher.pkcs5_keyivgen(password)
|
|
26
32
|
cipher
|
|
27
33
|
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
end
|
|
34
|
+
end # Crypt
|
|
35
|
+
end # Utils
|
|
36
|
+
end # Admin
|
|
37
|
+
end # Padrino
|
data/padrino-admin.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{padrino-admin}
|
|
8
|
-
s.version = "0.9.
|
|
8
|
+
s.version = "0.9.7"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
|
|
12
|
-
s.date = %q{2010-03-
|
|
12
|
+
s.date = %q{2010-03-22}
|
|
13
13
|
s.description = %q{Admin View for Padrino applications}
|
|
14
14
|
s.email = %q{padrinorb@gmail.com}
|
|
15
15
|
s.extra_rdoc_files = [
|
|
@@ -94,18 +94,18 @@ Gem::Specification.new do |s|
|
|
|
94
94
|
s.specification_version = 3
|
|
95
95
|
|
|
96
96
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
|
97
|
-
s.add_runtime_dependency(%q<padrino-core>, ["= 0.9.
|
|
98
|
-
s.add_runtime_dependency(%q<padrino-gen>, ["= 0.9.
|
|
99
|
-
s.add_runtime_dependency(%q<padrino-helpers>, ["= 0.9.
|
|
97
|
+
s.add_runtime_dependency(%q<padrino-core>, ["= 0.9.7"])
|
|
98
|
+
s.add_runtime_dependency(%q<padrino-gen>, ["= 0.9.7"])
|
|
99
|
+
s.add_runtime_dependency(%q<padrino-helpers>, ["= 0.9.7"])
|
|
100
100
|
s.add_development_dependency(%q<haml>, [">= 2.2.1"])
|
|
101
101
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
|
102
102
|
s.add_development_dependency(%q<mocha>, [">= 0.9.7"])
|
|
103
103
|
s.add_development_dependency(%q<rack-test>, [">= 0.5.0"])
|
|
104
104
|
s.add_development_dependency(%q<webrat>, [">= 0.5.1"])
|
|
105
105
|
else
|
|
106
|
-
s.add_dependency(%q<padrino-core>, ["= 0.9.
|
|
107
|
-
s.add_dependency(%q<padrino-gen>, ["= 0.9.
|
|
108
|
-
s.add_dependency(%q<padrino-helpers>, ["= 0.9.
|
|
106
|
+
s.add_dependency(%q<padrino-core>, ["= 0.9.7"])
|
|
107
|
+
s.add_dependency(%q<padrino-gen>, ["= 0.9.7"])
|
|
108
|
+
s.add_dependency(%q<padrino-helpers>, ["= 0.9.7"])
|
|
109
109
|
s.add_dependency(%q<haml>, [">= 2.2.1"])
|
|
110
110
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
|
111
111
|
s.add_dependency(%q<mocha>, [">= 0.9.7"])
|
|
@@ -113,9 +113,9 @@ Gem::Specification.new do |s|
|
|
|
113
113
|
s.add_dependency(%q<webrat>, [">= 0.5.1"])
|
|
114
114
|
end
|
|
115
115
|
else
|
|
116
|
-
s.add_dependency(%q<padrino-core>, ["= 0.9.
|
|
117
|
-
s.add_dependency(%q<padrino-gen>, ["= 0.9.
|
|
118
|
-
s.add_dependency(%q<padrino-helpers>, ["= 0.9.
|
|
116
|
+
s.add_dependency(%q<padrino-core>, ["= 0.9.7"])
|
|
117
|
+
s.add_dependency(%q<padrino-gen>, ["= 0.9.7"])
|
|
118
|
+
s.add_dependency(%q<padrino-helpers>, ["= 0.9.7"])
|
|
119
119
|
s.add_dependency(%q<haml>, [">= 2.2.1"])
|
|
120
120
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
|
121
121
|
s.add_dependency(%q<mocha>, [">= 0.9.7"])
|
|
@@ -47,7 +47,7 @@ class Account
|
|
|
47
47
|
|
|
48
48
|
##
|
|
49
49
|
# This method it's for authentication purpose
|
|
50
|
-
#
|
|
50
|
+
#
|
|
51
51
|
def self.authenticate(email, password)
|
|
52
52
|
account = first(:conditions => { :email => email }) if email.present?
|
|
53
53
|
account && account.password_clean == password ? account : nil
|
|
@@ -62,7 +62,7 @@ class Account
|
|
|
62
62
|
|
|
63
63
|
##
|
|
64
64
|
# This method it's used for retrive the original password.
|
|
65
|
-
#
|
|
65
|
+
#
|
|
66
66
|
def password_clean
|
|
67
67
|
crypted_password.decrypt(salt)
|
|
68
68
|
end
|
|
@@ -82,12 +82,12 @@ end
|
|
|
82
82
|
DataMapper.auto_migrate!
|
|
83
83
|
|
|
84
84
|
# We build some fake accounts
|
|
85
|
-
admin = Account.create(:name => "DAddYE", :role => "admin", :email => "d.dagostino@lipsiasoft.com",
|
|
85
|
+
admin = Account.create(:name => "DAddYE", :role => "admin", :email => "d.dagostino@lipsiasoft.com",
|
|
86
86
|
:password => "some", :password_confirmation => "some")
|
|
87
87
|
editor = Account.create(:name => "Dexter", :role => "editor", :email => "editor@lipsiasoft.com",
|
|
88
88
|
:password => "some", :password_confirmation => "some")
|
|
89
89
|
|
|
90
|
-
%w(News Press HowTo).each do |c|
|
|
90
|
+
%w(News Press HowTo).each do |c|
|
|
91
91
|
admin.categories.create(:name => c)
|
|
92
92
|
editor.categories.create(:name => c)
|
|
93
93
|
end
|
|
@@ -5,7 +5,7 @@ require 'padrino-gen/generators/actions'
|
|
|
5
5
|
Dir[File.dirname(__FILE__) + '/generators/{components}/**/*.rb'].each { |lib| require lib }
|
|
6
6
|
|
|
7
7
|
class TestAdminAppGenerator < Test::Unit::TestCase
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
def setup
|
|
10
10
|
`rm -rf /tmp/sample_project`
|
|
11
11
|
@project = Padrino::Generators::Project.dup
|
|
@@ -21,7 +21,7 @@ class TestAdminPageGenerator < Test::Unit::TestCase
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
context 'the admin page generator' do
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
should 'fail outside app root' do
|
|
26
26
|
output = silence_logger { @page.start(['foo', '-r=/tmp/sample_project']) }
|
|
27
27
|
assert_match(/not at the root/, output)
|
data/test/helper.rb
CHANGED
|
@@ -9,13 +9,12 @@ require 'shoulda'
|
|
|
9
9
|
require 'thor/group'
|
|
10
10
|
|
|
11
11
|
# We try to load the vendored padrino-core if exist
|
|
12
|
-
%w(core gen helpers).each do |
|
|
13
|
-
if File.exist?(File.dirname(__FILE__) + "/../../padrino-#{
|
|
14
|
-
$:.unshift File.dirname(__FILE__) + "/../../padrino-#{
|
|
12
|
+
%w(core gen helpers).each do |lib|
|
|
13
|
+
if File.exist?(File.dirname(__FILE__) + "/../../padrino-#{lib}/lib")
|
|
14
|
+
$:.unshift File.dirname(__FILE__) + "/../../padrino-#{lib}/lib"
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
require 'padrino-core/support_lite'
|
|
20
19
|
require 'padrino-admin'
|
|
21
20
|
|
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 9
|
|
8
|
-
-
|
|
9
|
-
version: 0.9.
|
|
8
|
+
- 7
|
|
9
|
+
version: 0.9.7
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Padrino Team
|
|
@@ -17,7 +17,7 @@ autorequire:
|
|
|
17
17
|
bindir: bin
|
|
18
18
|
cert_chain: []
|
|
19
19
|
|
|
20
|
-
date: 2010-03-
|
|
20
|
+
date: 2010-03-22 00:00:00 -07:00
|
|
21
21
|
default_executable:
|
|
22
22
|
dependencies:
|
|
23
23
|
- !ruby/object:Gem::Dependency
|
|
@@ -30,8 +30,8 @@ dependencies:
|
|
|
30
30
|
segments:
|
|
31
31
|
- 0
|
|
32
32
|
- 9
|
|
33
|
-
-
|
|
34
|
-
version: 0.9.
|
|
33
|
+
- 7
|
|
34
|
+
version: 0.9.7
|
|
35
35
|
type: :runtime
|
|
36
36
|
version_requirements: *id001
|
|
37
37
|
- !ruby/object:Gem::Dependency
|
|
@@ -44,8 +44,8 @@ dependencies:
|
|
|
44
44
|
segments:
|
|
45
45
|
- 0
|
|
46
46
|
- 9
|
|
47
|
-
-
|
|
48
|
-
version: 0.9.
|
|
47
|
+
- 7
|
|
48
|
+
version: 0.9.7
|
|
49
49
|
type: :runtime
|
|
50
50
|
version_requirements: *id002
|
|
51
51
|
- !ruby/object:Gem::Dependency
|
|
@@ -58,8 +58,8 @@ dependencies:
|
|
|
58
58
|
segments:
|
|
59
59
|
- 0
|
|
60
60
|
- 9
|
|
61
|
-
-
|
|
62
|
-
version: 0.9.
|
|
61
|
+
- 7
|
|
62
|
+
version: 0.9.7
|
|
63
63
|
type: :runtime
|
|
64
64
|
version_requirements: *id003
|
|
65
65
|
- !ruby/object:Gem::Dependency
|