radmin 0.2.0

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.
Files changed (111) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README +30 -0
  6. data/Rakefile +9 -0
  7. data/app/controllers/admin/accounts_controller.rb +16 -0
  8. data/app/controllers/admin/passwords_controller.rb +4 -0
  9. data/app/controllers/admin/sessions_controller.rb +13 -0
  10. data/app/controllers/admin/settings_controller.rb +40 -0
  11. data/app/controllers/admin/users_controller.rb +43 -0
  12. data/app/controllers/admin_controller.rb +15 -0
  13. data/app/helpers/admin_helper.rb +45 -0
  14. data/app/models/radmin/assignment.rb +8 -0
  15. data/app/models/radmin/role.rb +8 -0
  16. data/app/models/radmin/setting.rb +38 -0
  17. data/app/models/radmin/user.rb +18 -0
  18. data/app/views/admin/accounts/edit.html.haml +11 -0
  19. data/app/views/admin/passwords/edit.html.haml +11 -0
  20. data/app/views/admin/passwords/new.html.haml +8 -0
  21. data/app/views/admin/sessions/new.html.haml +9 -0
  22. data/app/views/admin/settings/_form.html.haml +12 -0
  23. data/app/views/admin/settings/edit.html.haml +3 -0
  24. data/app/views/admin/settings/index.html.haml +18 -0
  25. data/app/views/admin/settings/new.html.haml +3 -0
  26. data/app/views/admin/users/_form.html.haml +21 -0
  27. data/app/views/admin/users/edit.html.haml +3 -0
  28. data/app/views/admin/users/index.html.haml +18 -0
  29. data/app/views/admin/users/new.html.haml +3 -0
  30. data/app/views/layouts/admin.html.haml +40 -0
  31. data/config/routes.rb +10 -0
  32. data/lib/generators/radmin/install_generator.rb +31 -0
  33. data/lib/generators/radmin/templates/assets/images/admin/topnav_active.gif +0 -0
  34. data/lib/generators/radmin/templates/assets/images/admin/topnav_stretch.gif +0 -0
  35. data/lib/generators/radmin/templates/assets/javascripts/admin/application.js +1 -0
  36. data/lib/generators/radmin/templates/assets/javascripts/admin/jquery.js +16 -0
  37. data/lib/generators/radmin/templates/assets/javascripts/admin/jquery.rails.js +226 -0
  38. data/lib/generators/radmin/templates/assets/stylesheets/admin/reset.css +48 -0
  39. data/lib/generators/radmin/templates/assets/stylesheets/admin/style.css +422 -0
  40. data/lib/generators/radmin/templates/authorization_rules.rb +17 -0
  41. data/lib/generators/radmin/templates/migrations/01_radmin_create_users.rb +17 -0
  42. data/lib/generators/radmin/templates/migrations/02_radmin_create_roles.rb +13 -0
  43. data/lib/generators/radmin/templates/migrations/03_radmin_create_assignments.rb +15 -0
  44. data/lib/generators/radmin/templates/migrations/04_radmin_create_settings.rb +15 -0
  45. data/lib/radmin.rb +5 -0
  46. data/lib/radmin/admin_ui.rb +136 -0
  47. data/lib/radmin/engine.rb +8 -0
  48. data/lib/radmin/i18n.rb +14 -0
  49. data/lib/radmin/version.rb +3 -0
  50. data/lib/tasks/radmin.rake +13 -0
  51. data/radmin.gemspec +32 -0
  52. data/spec/dummy/Rakefile +7 -0
  53. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  54. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  55. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  56. data/spec/dummy/config.ru +4 -0
  57. data/spec/dummy/config/application.rb +45 -0
  58. data/spec/dummy/config/authorization_rules.rb +17 -0
  59. data/spec/dummy/config/boot.rb +10 -0
  60. data/spec/dummy/config/database.yml +22 -0
  61. data/spec/dummy/config/environment.rb +5 -0
  62. data/spec/dummy/config/environments/development.rb +28 -0
  63. data/spec/dummy/config/environments/production.rb +49 -0
  64. data/spec/dummy/config/environments/test.rb +35 -0
  65. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  66. data/spec/dummy/config/initializers/devise.rb +194 -0
  67. data/spec/dummy/config/initializers/inflections.rb +10 -0
  68. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  69. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  70. data/spec/dummy/config/initializers/session_store.rb +8 -0
  71. data/spec/dummy/config/locales/en.yml +5 -0
  72. data/spec/dummy/config/routes.rb +58 -0
  73. data/spec/dummy/db/migrate/20110524171909_radmin_create_users.rb +17 -0
  74. data/spec/dummy/db/migrate/20110524171910_radmin_create_roles.rb +13 -0
  75. data/spec/dummy/db/migrate/20110524171911_radmin_create_assignments.rb +15 -0
  76. data/spec/dummy/db/migrate/20110524171912_radmin_create_settings.rb +15 -0
  77. data/spec/dummy/db/schema.rb +59 -0
  78. data/spec/dummy/public/404.html +26 -0
  79. data/spec/dummy/public/422.html +26 -0
  80. data/spec/dummy/public/500.html +26 -0
  81. data/spec/dummy/public/favicon.ico +0 -0
  82. data/spec/dummy/public/images/admin/topnav_active.gif +0 -0
  83. data/spec/dummy/public/images/admin/topnav_stretch.gif +0 -0
  84. data/spec/dummy/public/javascripts/admin/application.js +1 -0
  85. data/spec/dummy/public/javascripts/admin/jquery.js +16 -0
  86. data/spec/dummy/public/javascripts/admin/jquery.rails.js +226 -0
  87. data/spec/dummy/public/javascripts/application.js +2 -0
  88. data/spec/dummy/public/javascripts/controls.js +965 -0
  89. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  90. data/spec/dummy/public/javascripts/effects.js +1123 -0
  91. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  92. data/spec/dummy/public/javascripts/rails.js +191 -0
  93. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  94. data/spec/dummy/public/stylesheets/admin/reset.css +48 -0
  95. data/spec/dummy/public/stylesheets/admin/style.css +422 -0
  96. data/spec/dummy/script/rails +6 -0
  97. data/spec/dummy/vendor/plugins/dynamic_form/MIT-LICENSE +20 -0
  98. data/spec/dummy/vendor/plugins/dynamic_form/README +13 -0
  99. data/spec/dummy/vendor/plugins/dynamic_form/Rakefile +10 -0
  100. data/spec/dummy/vendor/plugins/dynamic_form/dynamic_form.gemspec +12 -0
  101. data/spec/dummy/vendor/plugins/dynamic_form/init.rb +1 -0
  102. data/spec/dummy/vendor/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb +300 -0
  103. data/spec/dummy/vendor/plugins/dynamic_form/lib/action_view/locale/en.yml +8 -0
  104. data/spec/dummy/vendor/plugins/dynamic_form/lib/dynamic_form.rb +5 -0
  105. data/spec/dummy/vendor/plugins/dynamic_form/test/dynamic_form_i18n_test.rb +42 -0
  106. data/spec/dummy/vendor/plugins/dynamic_form/test/dynamic_form_test.rb +370 -0
  107. data/spec/dummy/vendor/plugins/dynamic_form/test/test_helper.rb +9 -0
  108. data/spec/integration/navigation_spec.rb +9 -0
  109. data/spec/radmin_spec.rb +7 -0
  110. data/spec/spec_helper.rb +33 -0
  111. metadata +270 -0
@@ -0,0 +1,17 @@
1
+ authorization do
2
+ role :guest do
3
+ has_permission_on :admin_accounts, :to => [:show,:edit,:update]
4
+ end
5
+
6
+ role :admin do
7
+ includes :guest
8
+ has_permission_on :admin_users, :to => :manage
9
+ has_permission_on :admin_settings, :to => :manage
10
+ end
11
+ end
12
+
13
+ privileges do
14
+ privilege :manage do
15
+ includes :index,:new,:create,:edit,:update,:show,:destroy
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ class RadminCreateUsers < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :radmin_users do |t|
4
+ t.database_authenticatable
5
+ t.recoverable
6
+ t.trackable
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :radmin_users, :email, :unique => true
11
+ add_index :radmin_users, :reset_password_token, :unique => true
12
+ end
13
+
14
+ def self.down
15
+ drop_table :radmin_users
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ class RadminCreateRoles < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :radmin_roles do |t|
4
+ t.string :name, :limit => 20, :null => false
5
+ t.timestamps
6
+ end
7
+ add_index :radmin_roles, :name, :unique => true
8
+ end
9
+
10
+ def self.down
11
+ drop_table :radmin_roles
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ class RadminCreateAssignments < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :radmin_assignments do |t|
4
+ t.references :radmin_user
5
+ t.references :radmin_role
6
+ t.timestamps
7
+ end
8
+ add_index :radmin_assignments, [:radmin_user_id,:radmin_role_id], :unique => true
9
+ add_index :radmin_assignments, :radmin_role_id
10
+ end
11
+
12
+ def self.down
13
+ drop_table :radmin_assignments
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class RadminCreateSettings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :radmin_settings, :force => true do |t|
4
+ t.string :key, :limit => 40, :null => false
5
+ t.string :value
6
+ t.timestamps
7
+ end
8
+
9
+ add_index :radmin_settings, :key, :uniq => true
10
+ end
11
+
12
+ def self.down
13
+ drop_table :radmin_settings
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ require 'radmin/engine'
2
+
3
+ require 'radmin/version'
4
+ require 'radmin/admin_ui'
5
+ require 'radmin/i18n'
@@ -0,0 +1,136 @@
1
+ #Taken from Radiant Nav Tab API
2
+ require 'singleton'
3
+
4
+ module Radmin
5
+ class AdminUI
6
+
7
+ class DuplicateTabNameError < StandardError; end
8
+
9
+ class NavTab < Array
10
+ attr_reader :name
11
+
12
+ def initialize(name)
13
+ @name = name
14
+ @items = []
15
+ end
16
+
17
+ def [](id)
18
+ unless id.kind_of? Fixnum
19
+ self.find {|subnav_item| subnav_item.name.to_s.titleize == id.to_s.titleize }
20
+ else
21
+ super
22
+ end
23
+ end
24
+
25
+ def <<(*args)
26
+ options = args.extract_options!
27
+ item = args.first
28
+ raise DuplicateTabNameError.new("duplicate tab name '#{item.name}'") if self[item.name]
29
+ item.tab = self if item.respond_to?(:tab=)
30
+ if options.empty?
31
+ super(item)
32
+ else
33
+ options.symbolize_keys!
34
+ before = options.delete(:before)
35
+ after = options.delete(:after)
36
+ tab_name = before || after
37
+ if self[tab_name]
38
+ _index = index(self[tab_name])
39
+ _index += 1 unless before
40
+ insert(_index, item)
41
+ else
42
+ super(item)
43
+ end
44
+ end
45
+ end
46
+
47
+ alias :add :<<
48
+
49
+ def add_item(*args)
50
+ options = args.extract_options!
51
+ options.symbolize_keys!
52
+ before = options.delete(:before)
53
+ after = options.delete(:after)
54
+ tab_name = before || after
55
+ if self[tab_name]
56
+ _index = index(self[tab_name])
57
+ _index += 1 unless before
58
+ insert(_index, NavSubItem.new(args.first, args.second))
59
+ else
60
+ add NavSubItem.new(args.first, args.second)
61
+ end
62
+ end
63
+
64
+ def visible?(user)
65
+ any? { |sub_item| sub_item.visible?(user) }
66
+ end
67
+ end
68
+
69
+ class NavSubItem
70
+ attr_reader :name, :url
71
+ attr_accessor :tab
72
+
73
+ def initialize(name, url = "#")
74
+ @name, @url = name, url
75
+ end
76
+
77
+ def visible?(user)
78
+ visible_by_controller?(user)
79
+ end
80
+
81
+ def relative_url
82
+ File.join('/', url)
83
+ end
84
+
85
+ private
86
+ def visible_by_controller?(user)
87
+ params = Rails.application.routes.recognize_path(url, :method => :get)
88
+ if params && params[:controller]
89
+ ctx = params[:controller].sub('/','_').to_sym
90
+ Authorization::Engine.instance.permit?(params[:action], :context => ctx, :user => user)
91
+ else
92
+ false
93
+ end
94
+ end
95
+ end
96
+
97
+ class << self
98
+ def tab(name,&block)
99
+ the_tab = instance.nav[name]
100
+ unless the_tab
101
+ the_tab = NavTab.new(name)
102
+ instance.nav << the_tab
103
+ end
104
+ if block_given?
105
+ yield(the_tab)
106
+ end
107
+ the_tab
108
+ end
109
+ end
110
+
111
+ include Singleton
112
+ attr_accessor :nav
113
+
114
+ def initialize
115
+ @nav = NavTab.new("Tab Container")
116
+ load_default_nav
117
+ end
118
+
119
+ def nav_tab(*args)
120
+ NavTab.new(*args)
121
+ end
122
+
123
+ def nav_item(*args)
124
+ NavSubItem.new(*args)
125
+ end
126
+
127
+ protected
128
+ def load_default_nav
129
+ settings = nav_tab("Settings")
130
+ settings << nav_item("Account", "/admin/account/edit")
131
+ settings << nav_item("Users", "/admin/users")
132
+ settings << nav_item("Application", "/admin/settings")
133
+ nav << settings
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,8 @@
1
+ require 'declarative_authorization'
2
+ require 'devise'
3
+ require 'haml-rails'
4
+
5
+ module Radmin
6
+ class Engine < Rails::Engine
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ module Radmin
2
+ class I18n
3
+ class << self
4
+ def t(key, options = {})
5
+ if defined?(::I18n)
6
+ ::I18n.t(key, options.merge(:scope => :radmin))
7
+ else
8
+ options[:default]
9
+ end
10
+ end
11
+ alias_method :translate, :t
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module Radmin
2
+ VERSION = "0.2.0"
3
+ end
@@ -0,0 +1,13 @@
1
+ namespace :radmin do
2
+ desc "Setup default admin user and roles"
3
+ task :setup => :environment do
4
+ ActiveRecord::Base.transaction do
5
+ user = Radmin::User.new
6
+ user.email = 'admin@example.net'
7
+ user.password = 'password'
8
+ user.password_confirmation = 'password'
9
+ user.save!
10
+ user.roles << Radmin::Role.create!(:name => "admin")
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "radmin/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "radmin"
7
+ s.version = Radmin::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Damian Caruso"]
10
+ s.email = ["damian.caruso@gmail.com"]
11
+ s.homepage = "http://github.com/cdamian/radmin"
12
+ s.summary = %q{A drop in admin panel for existing rails applications}
13
+ s.description = %q{A drop in admin panel for existing rails applications}
14
+
15
+ s.rubyforge_project = "radmin"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "declarative_authorization", "~> 0.5.2"
23
+ s.add_dependency "devise", "~> 1.3.4"
24
+ s.add_dependency "haml-rails", "~> 0.3.4"
25
+
26
+ s.add_development_dependency "rails", "3.0.7"
27
+ s.add_development_dependency "rake", "0.8.7"
28
+ s.add_development_dependency "capybara", "~> 0.4.0"
29
+ s.add_development_dependency "rspec-rails", "~> 2.0.0.beta"
30
+ s.add_development_dependency "launchy", "~> 0.4.0"
31
+ s.add_development_dependency "sqlite3"
32
+ end
@@ -0,0 +1,7 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+ require 'rake'
6
+
7
+ Dummy::Application.load_tasks
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= stylesheet_link_tag :all %>
6
+ <%= javascript_include_tag :defaults %>
7
+ <%= csrf_meta_tag %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run Dummy::Application
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require "active_model/railtie"
4
+ require "active_record/railtie"
5
+ require "action_controller/railtie"
6
+ require "action_view/railtie"
7
+ require "action_mailer/railtie"
8
+
9
+ Bundler.require
10
+ require "radmin"
11
+
12
+ module Dummy
13
+ class Application < Rails::Application
14
+ # Settings in config/environments/* take precedence over those specified here.
15
+ # Application configuration should go into files in config/initializers
16
+ # -- all .rb files in that directory are automatically loaded.
17
+
18
+ # Custom directories with classes and modules you want to be autoloadable.
19
+ # config.autoload_paths += %W(#{config.root}/extras)
20
+
21
+ # Only load the plugins named here, in the order given (default is alphabetical).
22
+ # :all can be used as a placeholder for all plugins not explicitly named.
23
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
24
+
25
+ # Activate observers that should always be running.
26
+ # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
27
+
28
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
29
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
30
+ # config.time_zone = 'Central Time (US & Canada)'
31
+
32
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
33
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
34
+ # config.i18n.default_locale = :de
35
+
36
+ # JavaScript files you want as :defaults (application.js is always included).
37
+ # config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
38
+
39
+ # Configure the default encoding used in templates for Ruby 1.9.
40
+ config.encoding = "utf-8"
41
+
42
+ # Configure sensitive parameters which will be filtered from the log file.
43
+ config.filter_parameters += [:password]
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ authorization do
2
+ role :guest do
3
+ has_permission_on :admin_accounts, :to => [:show,:edit,:update]
4
+ end
5
+
6
+ role :admin do
7
+ includes :guest
8
+ has_permission_on :admin_users, :to => :manage
9
+ has_permission_on :admin_settings, :to => :manage
10
+ end
11
+ end
12
+
13
+ privileges do
14
+ privilege :manage do
15
+ includes :index,:new,:create,:edit,:update,:show,:destroy
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ if File.exist?(gemfile)
5
+ ENV['BUNDLE_GEMFILE'] = gemfile
6
+ require 'bundler'
7
+ Bundler.setup
8
+ end
9
+
10
+ $:.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,22 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3
3
+ development:
4
+ adapter: sqlite3
5
+ database: db/development.sqlite3
6
+ pool: 5
7
+ timeout: 5000
8
+
9
+ # Warning: The database defined as "test" will be erased and
10
+ # re-generated from your development database when you run "rake".
11
+ # Do not set this db to the same as development or production.
12
+ test:
13
+ adapter: sqlite3
14
+ database: db/test.sqlite3
15
+ pool: 5
16
+ timeout: 5000
17
+
18
+ production:
19
+ adapter: sqlite3
20
+ database: db/production.sqlite3
21
+ pool: 5
22
+ timeout: 5000