typus 0.9.17
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/.gitignore +8 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +86 -0
- data/Rakefile +61 -0
- data/VERSION +1 -0
- data/app/controllers/admin/master_controller.rb +354 -0
- data/app/controllers/typus_controller.rb +128 -0
- data/app/helpers/admin/form_helper.rb +386 -0
- data/app/helpers/admin/master_helper.rb +104 -0
- data/app/helpers/admin/public_helper.rb +27 -0
- data/app/helpers/admin/sidebar_helper.rb +236 -0
- data/app/helpers/admin/table_helper.rb +227 -0
- data/app/helpers/typus_helper.rb +194 -0
- data/app/models/typus_mailer.rb +14 -0
- data/app/models/typus_user.rb +5 -0
- data/app/views/admin/dashboard/_sidebar.html.erb +9 -0
- data/app/views/admin/resources/edit.html.erb +24 -0
- data/app/views/admin/resources/index.html.erb +23 -0
- data/app/views/admin/resources/new.html.erb +22 -0
- data/app/views/admin/resources/show.html.erb +18 -0
- data/app/views/admin/shared/_footer.html.erb +1 -0
- data/app/views/admin/shared/_pagination.html.erb +28 -0
- data/app/views/layouts/admin.html.erb +73 -0
- data/app/views/layouts/typus.html.erb +29 -0
- data/app/views/typus/dashboard.html.erb +9 -0
- data/app/views/typus/recover_password.html.erb +7 -0
- data/app/views/typus/reset_password.html.erb +15 -0
- data/app/views/typus/sign_in.html.erb +9 -0
- data/app/views/typus/sign_up.html.erb +7 -0
- data/app/views/typus_mailer/reset_password_link.erb +11 -0
- data/config/locales/typus/de.yml +109 -0
- data/config/locales/typus/es.yml +109 -0
- data/config/locales/typus/language.yml.template +113 -0
- data/config/locales/typus/pt-BR.yml +111 -0
- data/config/locales/typus/ru.yml +111 -0
- data/generators/typus/templates/config/initializers/typus.rb +33 -0
- data/generators/typus/templates/config/typus/README +51 -0
- data/generators/typus/templates/config/typus/application.yml +6 -0
- data/generators/typus/templates/config/typus/application_roles.yml +23 -0
- data/generators/typus/templates/config/typus/typus.yml +14 -0
- data/generators/typus/templates/config/typus/typus_roles.yml +2 -0
- data/generators/typus/templates/db/create_typus_users.rb +21 -0
- data/generators/typus/templates/public/images/admin/arrow_down.gif +0 -0
- data/generators/typus/templates/public/images/admin/arrow_up.gif +0 -0
- data/generators/typus/templates/public/images/admin/spinner.gif +0 -0
- data/generators/typus/templates/public/images/admin/status_false.gif +0 -0
- data/generators/typus/templates/public/images/admin/status_true.gif +0 -0
- data/generators/typus/templates/public/images/admin/trash.gif +0 -0
- data/generators/typus/templates/public/javascripts/admin/application.js +14 -0
- data/generators/typus/templates/public/stylesheets/admin/reset.css +68 -0
- data/generators/typus/templates/public/stylesheets/admin/screen.css +729 -0
- data/generators/typus/typus_generator.rb +122 -0
- data/generators/typus_update_schema_to_01/templates/config/typus.yml +14 -0
- data/generators/typus_update_schema_to_01/templates/migration.rb +11 -0
- data/generators/typus_update_schema_to_01/typus_update_schema_to_01_generator.rb +19 -0
- data/lib/typus.rb +122 -0
- data/lib/typus/active_record.rb +307 -0
- data/lib/typus/authentication.rb +142 -0
- data/lib/typus/configuration.rb +85 -0
- data/lib/typus/extensions/routes.rb +15 -0
- data/lib/typus/format.rb +55 -0
- data/lib/typus/generator.rb +81 -0
- data/lib/typus/hash.rb +8 -0
- data/lib/typus/locale.rb +17 -0
- data/lib/typus/object.rb +21 -0
- data/lib/typus/quick_edit.rb +40 -0
- data/lib/typus/reloader.rb +15 -0
- data/lib/typus/string.rb +11 -0
- data/lib/typus/templates/index.html.erb +11 -0
- data/lib/typus/templates/resource_controller.rb.erb +15 -0
- data/lib/typus/templates/resource_controller_test.rb.erb +10 -0
- data/lib/typus/templates/resources_controller.rb.erb +37 -0
- data/lib/typus/user.rb +134 -0
- data/lib/vendor/active_record.rb +15 -0
- data/lib/vendor/paginator.rb +143 -0
- data/rails/init.rb +3 -0
- data/tasks/typus_tasks.rake +32 -0
- data/test/config/broken/application.yml +68 -0
- data/test/config/broken/application_roles.yml +20 -0
- data/test/config/broken/empty.yml +0 -0
- data/test/config/broken/empty_roles.yml +0 -0
- data/test/config/broken/undefined.yml +3 -0
- data/test/config/broken/undefined_roles.yml +6 -0
- data/test/config/default/typus.yml +14 -0
- data/test/config/default/typus_roles.yml +2 -0
- data/test/config/empty/empty_01.yml +0 -0
- data/test/config/empty/empty_01_roles.yml +0 -0
- data/test/config/empty/empty_02.yml +0 -0
- data/test/config/empty/empty_02_roles.yml +0 -0
- data/test/config/locales/es.yml +10 -0
- data/test/config/ordered/001_roles.yml +2 -0
- data/test/config/ordered/002_roles.yml +2 -0
- data/test/config/unordered/app_one_roles.yml +2 -0
- data/test/config/unordered/app_two_roles.yml +2 -0
- data/test/config/working/application.yml +68 -0
- data/test/config/working/application_roles.yml +22 -0
- data/test/config/working/typus.yml +14 -0
- data/test/config/working/typus_roles.yml +2 -0
- data/test/fixtures/app/controllers/admin/assets_controller.rb +2 -0
- data/test/fixtures/app/controllers/admin/categories_controller.rb +2 -0
- data/test/fixtures/app/controllers/admin/comments_controller.rb +2 -0
- data/test/fixtures/app/controllers/admin/pages_controller.rb +2 -0
- data/test/fixtures/app/controllers/admin/posts_controller.rb +2 -0
- data/test/fixtures/app/controllers/admin/status_controller.rb +6 -0
- data/test/fixtures/app/controllers/admin/typus_users_controller.rb +2 -0
- data/test/fixtures/app/controllers/admin/watch_dog_controller.rb +6 -0
- data/test/fixtures/app/views/admin/comments/_edit.html.erb +1 -0
- data/test/fixtures/app/views/admin/comments/_index.html.erb +1 -0
- data/test/fixtures/app/views/admin/comments/_new.html.erb +1 -0
- data/test/fixtures/app/views/admin/comments/_show.html.erb +1 -0
- data/test/fixtures/app/views/admin/comments/_sidebar.html.erb +1 -0
- data/test/fixtures/app/views/admin/dashboard/_content.html.erb +1 -0
- data/test/fixtures/app/views/admin/dashboard/_sidebar.html.erb +1 -0
- data/test/fixtures/app/views/admin/resources/_sidebar.html.erb +1 -0
- data/test/fixtures/app/views/admin/shared/_footer.html.erb +1 -0
- data/test/fixtures/app/views/admin/status/index.html.erb +1 -0
- data/test/fixtures/app/views/admin/templates/_datepicker.html.erb +1 -0
- data/test/fixtures/assets.yml +11 -0
- data/test/fixtures/categories.yml +14 -0
- data/test/fixtures/comments.yml +27 -0
- data/test/fixtures/pages.yml +41 -0
- data/test/fixtures/posts.yml +37 -0
- data/test/fixtures/typus_users.yml +54 -0
- data/test/functional/admin/assets_controller_test.rb +57 -0
- data/test/functional/admin/categories_controller_test.rb +106 -0
- data/test/functional/admin/comments_controller_test.rb +120 -0
- data/test/functional/admin/master_controller_test.rb +5 -0
- data/test/functional/admin/posts_controller_test.rb +261 -0
- data/test/functional/admin/status_controller_test.rb +43 -0
- data/test/functional/admin/typus_users_controller_test.rb +239 -0
- data/test/functional/typus_controller_test.rb +321 -0
- data/test/helper.rb +51 -0
- data/test/helpers/admin/form_helper_test.rb +337 -0
- data/test/helpers/admin/master_helper_test.rb +69 -0
- data/test/helpers/admin/public_helper_test.rb +26 -0
- data/test/helpers/admin/sidebar_helper_test.rb +335 -0
- data/test/helpers/admin/table_helper_test.rb +239 -0
- data/test/helpers/typus_helper_test.rb +117 -0
- data/test/lib/active_record_test.rb +382 -0
- data/test/lib/configuration_test.rb +94 -0
- data/test/lib/hash_test.rb +11 -0
- data/test/lib/routes_test.rb +71 -0
- data/test/lib/string_test.rb +25 -0
- data/test/lib/typus_test.rb +85 -0
- data/test/models.rb +51 -0
- data/test/schema.rb +64 -0
- data/test/unit/typus_mailer_test.rb +33 -0
- data/test/unit/typus_test.rb +17 -0
- data/test/unit/typus_user_roles_test.rb +90 -0
- data/test/unit/typus_user_test.rb +177 -0
- data/test/vendor/active_record_test.rb +18 -0
- data/test/vendor/paginator_test.rb +136 -0
- data/typus.gemspec +228 -0
- metadata +241 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
|
|
3
|
+
module Authentication
|
|
4
|
+
|
|
5
|
+
protected
|
|
6
|
+
|
|
7
|
+
# Require login checks if the user is logged on Typus, otherwise
|
|
8
|
+
# is sent to the sign in page with a :back_to param to return where
|
|
9
|
+
# she tried to go.
|
|
10
|
+
def require_login
|
|
11
|
+
|
|
12
|
+
# Uncomment the following line for demo purpouses.
|
|
13
|
+
# session[:typus_user_id] = Typus.user_class.find(:first)
|
|
14
|
+
|
|
15
|
+
if session[:typus_user_id]
|
|
16
|
+
set_current_user
|
|
17
|
+
else
|
|
18
|
+
back_to = (request.env['REQUEST_URI'] == '/admin') ? nil : request.env['REQUEST_URI']
|
|
19
|
+
redirect_to admin_sign_in_path(:back_to => back_to)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Return the current user. If role does not longer exist on the
|
|
25
|
+
# system @current_user will be signed out from Typus.
|
|
26
|
+
def set_current_user
|
|
27
|
+
|
|
28
|
+
@current_user = Typus.user_class.find(session[:typus_user_id])
|
|
29
|
+
|
|
30
|
+
unless @current_user.respond_to?(:role)
|
|
31
|
+
raise _("Run 'script/generate typus_update_schema_to_01 -f && rake db:migrate' to update database schema.")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
unless Typus::Configuration.roles.keys.include?(@current_user.role)
|
|
35
|
+
raise _("Role does no longer exists.")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
unless @current_user.status
|
|
39
|
+
back_to = (request.env['REQUEST_URI'] == '/admin') ? nil : request.env['REQUEST_URI']
|
|
40
|
+
raise _("Typus user has been disabled.")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
rescue Exception => error
|
|
44
|
+
flash[:notice] = error.message
|
|
45
|
+
session[:typus_user_id] = nil
|
|
46
|
+
redirect_to admin_sign_in_path(:back_to => back_to)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Action is available on: edit, update, toggle and destroy
|
|
50
|
+
def check_if_user_can_perform_action_on_user
|
|
51
|
+
|
|
52
|
+
return unless @item.kind_of?(Typus.user_class)
|
|
53
|
+
|
|
54
|
+
current_user = (@current_user == @item)
|
|
55
|
+
|
|
56
|
+
message = case params[:action]
|
|
57
|
+
when 'edit'
|
|
58
|
+
|
|
59
|
+
# Only admin and owner of Typus User can edit.
|
|
60
|
+
if !@current_user.is_root? && !current_user
|
|
61
|
+
_("As you're not the admin or the owner of this record you cannot edit it.")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
when 'update'
|
|
65
|
+
|
|
66
|
+
# current_user cannot change her role.
|
|
67
|
+
if current_user && !(@item.role == params[:item][:role])
|
|
68
|
+
_("You can't change your role.")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
when 'toggle'
|
|
72
|
+
|
|
73
|
+
# Only admin can toggle typus user status, but not herself.
|
|
74
|
+
if @current_user.is_root? && current_user
|
|
75
|
+
_("You can't toggle your status.")
|
|
76
|
+
elsif !@current_user.is_root?
|
|
77
|
+
_("You're not allowed to toggle status.")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
when 'destroy'
|
|
81
|
+
|
|
82
|
+
# Admin can remove anything except herself.
|
|
83
|
+
if @current_user.is_root? && current_user
|
|
84
|
+
_("You can't remove yourself.")
|
|
85
|
+
elsif !@current_user.is_root?
|
|
86
|
+
_("You're not allowed to remove Typus Users.")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
if message
|
|
92
|
+
flash[:notice] = message
|
|
93
|
+
redirect_to :back rescue redirect_to admin_dashboard_path
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# This method checks if the user can perform the requested action.
|
|
99
|
+
# It works on models, so its available on the admin_controller.
|
|
100
|
+
def check_if_user_can_perform_action_on_resource
|
|
101
|
+
|
|
102
|
+
message = case params[:action]
|
|
103
|
+
when 'index', 'show'
|
|
104
|
+
_("{{current_user_role}} can't display items.",
|
|
105
|
+
:current_user_role => @current_user.role.capitalize)
|
|
106
|
+
when 'edit', 'update', 'position', 'toggle', 'relate', 'unrelate'
|
|
107
|
+
when 'destroy'
|
|
108
|
+
_("{{current_user_role}} can't delete this item.",
|
|
109
|
+
:current_user_role => @current_user.role.capitalize)
|
|
110
|
+
else
|
|
111
|
+
_("{{current_user_role}} can't perform action ({{action}}).",
|
|
112
|
+
:current_user_role => @current_user.role.capitalize,
|
|
113
|
+
:action => params[:action])
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
unless @current_user.can_perform?(@resource[:class], params[:action])
|
|
117
|
+
flash[:notice] = message || _("{{current_user_role}} can't perform action. ({{action}}).",
|
|
118
|
+
:current_user_role => @current_user.role.capitalize,
|
|
119
|
+
:action => params[:action])
|
|
120
|
+
redirect_to :back rescue redirect_to admin_dashboard_path
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# This method checks if the user can perform the requested action.
|
|
126
|
+
# It works on resources, which are not models, so its available on
|
|
127
|
+
# the typus_controller.
|
|
128
|
+
def check_if_user_can_perform_action_on_resource_without_model
|
|
129
|
+
controller = params[:controller].split('/').last
|
|
130
|
+
action = params[:action]
|
|
131
|
+
unless @current_user.can_perform?(controller.camelize, action, { :special => true })
|
|
132
|
+
flash[:notice] = _("{{current_user_role}} can't go to {{action}} on {{controller}}.",
|
|
133
|
+
:current_user_role => @current_user.role.capitalize,
|
|
134
|
+
:action => action,
|
|
135
|
+
:controller => controller.humanize.downcase)
|
|
136
|
+
redirect_to :back rescue redirect_to admin_dashboard_path
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
|
|
3
|
+
module Configuration
|
|
4
|
+
|
|
5
|
+
# Default options which can be overwritten from the initializer.
|
|
6
|
+
typus_options = { :app_name => 'Typus',
|
|
7
|
+
:config_folder => 'config/typus',
|
|
8
|
+
:email => 'admin@example.com',
|
|
9
|
+
:locales => [ [ "English", :en ] ],
|
|
10
|
+
:recover_password => false,
|
|
11
|
+
:root => 'admin',
|
|
12
|
+
:ssl => false,
|
|
13
|
+
:templates_folder => 'admin/templates',
|
|
14
|
+
:user_class_name => 'TypusUser',
|
|
15
|
+
:user_fk => 'typus_user_id' }
|
|
16
|
+
|
|
17
|
+
# Default options which can be overwritten from the initializer.
|
|
18
|
+
model_options = { :default_action_on_item => 'edit',
|
|
19
|
+
:end_year => nil,
|
|
20
|
+
:form_rows => 10,
|
|
21
|
+
:icon_on_boolean => true,
|
|
22
|
+
:index_after_save => false,
|
|
23
|
+
:minute_step => 5,
|
|
24
|
+
:nil => 'nil',
|
|
25
|
+
:on_header => false,
|
|
26
|
+
:only_user_items => false,
|
|
27
|
+
:per_page => 15,
|
|
28
|
+
:sidebar_selector => 5,
|
|
29
|
+
:start_year => nil,
|
|
30
|
+
:tiny_mce => { :theme => 'advanced',
|
|
31
|
+
:theme_advanced_toolbar_location => 'top',
|
|
32
|
+
:theme_advanced_toolbar_align => 'left' },
|
|
33
|
+
:toggle => true }
|
|
34
|
+
|
|
35
|
+
@@options = typus_options.merge(model_options)
|
|
36
|
+
|
|
37
|
+
mattr_accessor :options
|
|
38
|
+
|
|
39
|
+
# Read Typus Configuration files placed on <tt>config/typus/**/*.yml</tt>.
|
|
40
|
+
def self.config!
|
|
41
|
+
|
|
42
|
+
files = Dir["#{Rails.root}/#{options[:config_folder]}/**/*.yml"].sort
|
|
43
|
+
files = files.delete_if { |x| x.include?('_roles.yml') }
|
|
44
|
+
|
|
45
|
+
@@config = {}
|
|
46
|
+
files.each do |file|
|
|
47
|
+
data = YAML.load_file(file)
|
|
48
|
+
@@config = @@config.merge(data) if data
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
return @@config
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
mattr_accessor :config
|
|
56
|
+
|
|
57
|
+
# Read Typus Roles from configuration files placed on <tt>config/typus/**/*_roles.yml</tt>.
|
|
58
|
+
def self.roles!
|
|
59
|
+
|
|
60
|
+
files = Dir["#{Rails.root}/#{options[:config_folder]}/**/*_roles.yml"].sort
|
|
61
|
+
|
|
62
|
+
@@roles = { options[:root] => {} }
|
|
63
|
+
|
|
64
|
+
files.each do |file|
|
|
65
|
+
data = YAML.load_file(file)
|
|
66
|
+
next unless data
|
|
67
|
+
data.each do |key, value|
|
|
68
|
+
next unless value
|
|
69
|
+
begin
|
|
70
|
+
@@roles[key] = @@roles[key].merge(value)
|
|
71
|
+
rescue
|
|
72
|
+
@@roles[key] = value
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
return @@roles.compact
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
mattr_accessor :roles
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
if defined?(ActionController::Routing::RouteSet)
|
|
2
|
+
|
|
3
|
+
class ActionController::Routing::RouteSet
|
|
4
|
+
|
|
5
|
+
def load_routes_with_typus!
|
|
6
|
+
typus_routes = File.join(File.dirname(__FILE__), 'routes_hack.rb')
|
|
7
|
+
add_configuration_file(typus_routes) unless configuration_files.include?(typus_routes)
|
|
8
|
+
load_routes_without_typus!
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
alias_method_chain :load_routes!, :typus
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
data/lib/typus/format.rb
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
|
|
3
|
+
module Format
|
|
4
|
+
|
|
5
|
+
protected
|
|
6
|
+
|
|
7
|
+
def generate_html
|
|
8
|
+
|
|
9
|
+
items_count = @resource[:class].count(:joins => @joins, :conditions => @conditions)
|
|
10
|
+
items_per_page = @resource[:class].typus_options_for(:per_page).to_i
|
|
11
|
+
|
|
12
|
+
@pager = ::Paginator.new(items_count, items_per_page) do |offset, per_page|
|
|
13
|
+
data(:limit => per_page, :offset => offset)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
@items = @pager.page(params[:page])
|
|
17
|
+
|
|
18
|
+
select_template :index
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def generate_csv
|
|
23
|
+
|
|
24
|
+
require 'fastercsv'
|
|
25
|
+
|
|
26
|
+
fields = @resource[:class].typus_fields_for(:csv).collect { |i| i.first }
|
|
27
|
+
csv_string = FasterCSV.generate do |csv|
|
|
28
|
+
csv << fields.map { |f| _(f.humanize) }
|
|
29
|
+
data.each { |i| csv << fields.map { |f| i.send(f) } }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
filename = "#{Time.now.strftime("%Y%m%d%H%M%S")}_#{@resource[:self]}.csv"
|
|
33
|
+
send_data(csv_string,
|
|
34
|
+
:type => 'text/csv; charset=utf-8; header=present',
|
|
35
|
+
:filename => filename)
|
|
36
|
+
|
|
37
|
+
rescue LoadError
|
|
38
|
+
render :text => _("FasterCSV is not installed.")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def generate_xml
|
|
42
|
+
fields = @resource[:class].typus_fields_for(:xml).collect { |i| i.first }
|
|
43
|
+
render :xml => data.to_xml(:only => fields)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def data(*args)
|
|
47
|
+
eager_loading = @resource[:class].reflect_on_all_associations(:belongs_to).map { |i| i.name }
|
|
48
|
+
options = { :joins => @joins, :conditions => @conditions, :order => @order, :include => eager_loading }
|
|
49
|
+
options.merge!(args.extract_options!)
|
|
50
|
+
@resource[:class].find(:all, options)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require 'ftools'
|
|
2
|
+
|
|
3
|
+
module Typus
|
|
4
|
+
|
|
5
|
+
def self.generator
|
|
6
|
+
|
|
7
|
+
# Create app/controllers/admin if doesn't exist.
|
|
8
|
+
admin_controllers_folder = "#{Rails.root}/app/controllers/admin"
|
|
9
|
+
Dir.mkdir(admin_controllers_folder) unless File.directory?(admin_controllers_folder)
|
|
10
|
+
|
|
11
|
+
# Get a list of controllers under `app/controllers/admin`.
|
|
12
|
+
admin_controllers = Dir["#{Rails.root}/vendor/plugins/*/app/controllers/admin/*.rb", "#{admin_controllers_folder}/*.rb"]
|
|
13
|
+
admin_controllers = admin_controllers.map { |i| File.basename(i) }
|
|
14
|
+
|
|
15
|
+
# Create app/views/admin if doesn't exist.
|
|
16
|
+
admin_views_folder = "#{Rails.root}/app/views/admin"
|
|
17
|
+
Dir.mkdir(admin_views_folder) unless File.directory?(admin_views_folder)
|
|
18
|
+
|
|
19
|
+
# Create test/functional/admin if doesn't exist.
|
|
20
|
+
admin_controller_tests_folder = "#{Rails.root}/test/functional/admin"
|
|
21
|
+
if File.directory?("#{Rails.root}/test")
|
|
22
|
+
Dir.mkdir(admin_controller_tests_folder) unless File.directory?(admin_controller_tests_folder)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Get a list of functional tests under `test/functional/admin`.
|
|
26
|
+
admin_controller_tests = Dir["#{admin_controller_tests_folder}/*.rb"]
|
|
27
|
+
admin_controller_tests = admin_controller_tests.map { |i| File.basename(i) }
|
|
28
|
+
|
|
29
|
+
# Generate controllers for tableless models.
|
|
30
|
+
resources.each do |resource|
|
|
31
|
+
|
|
32
|
+
controller_filename = "#{resource.underscore}_controller.rb"
|
|
33
|
+
controller_location = "#{admin_controllers_folder}/#{controller_filename}"
|
|
34
|
+
|
|
35
|
+
if !admin_controllers.include?(controller_filename)
|
|
36
|
+
template = File.read("#{File.dirname(__FILE__)}/templates/resource_controller.rb.erb")
|
|
37
|
+
content = ERB.new(template).result(binding)
|
|
38
|
+
File.open(controller_location, "w+") { |f| f << content }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# And now we create the view.
|
|
42
|
+
view_folder = "#{admin_views_folder}/#{resource.underscore}"
|
|
43
|
+
view_filename = "index.html.erb"
|
|
44
|
+
|
|
45
|
+
if !File.exist?("#{view_folder}/#{view_filename}")
|
|
46
|
+
Dir.mkdir(view_folder) unless File.directory?(view_folder)
|
|
47
|
+
origin = "#{File.dirname(__FILE__)}/templates/index.html.erb"
|
|
48
|
+
destination = "#{view_folder}/#{view_filename}"
|
|
49
|
+
File.copy(origin, destination)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Generate:
|
|
55
|
+
# `app/controllers/admin/#{resource}_controller.rb`
|
|
56
|
+
# `test/functional/admin/#{resource}_controller_test.rb`
|
|
57
|
+
models.each do |model|
|
|
58
|
+
|
|
59
|
+
controller_filename = "#{model.tableize}_controller.rb"
|
|
60
|
+
controller_location = "#{admin_controllers_folder}/#{controller_filename}"
|
|
61
|
+
|
|
62
|
+
if !admin_controllers.include?(controller_filename)
|
|
63
|
+
template = File.read("#{File.dirname(__FILE__)}/templates/resources_controller.rb.erb")
|
|
64
|
+
content = ERB.new(template).result(binding)
|
|
65
|
+
File.open(controller_location, "w+") { |f| f << content }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
test_filename = "#{model.tableize}_controller_test.rb"
|
|
69
|
+
test_location = "#{admin_controller_tests_folder}/#{test_filename}"
|
|
70
|
+
|
|
71
|
+
if !admin_controller_tests.include?(test_filename) && File.directory?("#{Rails.root}/test")
|
|
72
|
+
template = File.read("#{File.dirname(__FILE__)}/templates/resource_controller_test.rb.erb")
|
|
73
|
+
content = ERB.new(template).result(binding)
|
|
74
|
+
File.open(test_location, "w+") { |f| f << content }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
data/lib/typus/hash.rb
ADDED
data/lib/typus/locale.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
|
|
3
|
+
module Locale
|
|
4
|
+
|
|
5
|
+
def set_locale
|
|
6
|
+
if params[:locale]
|
|
7
|
+
I18n.locale = params[:locale]
|
|
8
|
+
session[:typus_locale] = params[:locale]
|
|
9
|
+
redirect_to :back
|
|
10
|
+
else
|
|
11
|
+
I18n.locale = session[:typus_locale] || Typus.default_locale
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
data/lib/typus/object.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
class Object
|
|
2
|
+
|
|
3
|
+
# Instead of having to translate strings and defining a default value:
|
|
4
|
+
#
|
|
5
|
+
# t("Hello World!", :default => 'Hello World!')
|
|
6
|
+
#
|
|
7
|
+
# We define this method to define the value only once:
|
|
8
|
+
#
|
|
9
|
+
# _("Hello World!")
|
|
10
|
+
#
|
|
11
|
+
# Note that interpolation still works ...
|
|
12
|
+
#
|
|
13
|
+
# _("Hello {{world}}!", :world => @world)
|
|
14
|
+
#
|
|
15
|
+
def _(msg, *args)
|
|
16
|
+
options = args.extract_options!
|
|
17
|
+
options[:default] = msg
|
|
18
|
+
I18n.t(msg, options)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
|
|
3
|
+
module QuickEdit
|
|
4
|
+
|
|
5
|
+
def quick_edit
|
|
6
|
+
|
|
7
|
+
render :text => '' and return unless session[:typus_user_id]
|
|
8
|
+
|
|
9
|
+
links = [[ "Dashboard", admin_dashboard_path ]]
|
|
10
|
+
links << [ params[:message], "/admin/#{params[:path]}" ] if params[:message] && params[:path]
|
|
11
|
+
|
|
12
|
+
options = links.reverse.map do |link|
|
|
13
|
+
"<li><a href=\"#{link.last}\">#{link.first}</a></li>"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
content = <<-HTML
|
|
17
|
+
var links = '';
|
|
18
|
+
links += '<div id="quick_edit">';
|
|
19
|
+
links += '<ul>';
|
|
20
|
+
links += '#{options}';
|
|
21
|
+
links += '</ul>';
|
|
22
|
+
links += '</div>';
|
|
23
|
+
links += '<style type="text/css">';
|
|
24
|
+
links += '<!--';
|
|
25
|
+
links += '#quick_edit { font-size: 12px; font-family: sans-serif; position: absolute; top: 0px; right: 0px; margin: 10px; }';
|
|
26
|
+
links += '#quick_edit a { color: #FFF; font-weight: bold; text-decoration: none; }'
|
|
27
|
+
links += '#quick_edit ul { margin: 0; padding: 0; }';
|
|
28
|
+
links += '#quick_edit li { display: inline; background: #000; margin: 0 0 0 5px; padding: 3px 5px; }';
|
|
29
|
+
links += '-->';
|
|
30
|
+
links += '</style>';
|
|
31
|
+
document.write(links);
|
|
32
|
+
HTML
|
|
33
|
+
|
|
34
|
+
render :text => content
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|