typus 0.9.17
Sign up to get free protection for your applications and to get access to all the features.
- 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
|