lipsiadmin 5.1.6 → 5.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/lib/access_control/authentication.rb +20 -20
  2. data/lib/access_control/base.rb +40 -40
  3. data/lib/controller/ext.rb +27 -27
  4. data/lib/controller/lipsiadmin_controller.rb +3 -3
  5. data/lib/controller/pdf_builder.rb +33 -31
  6. data/lib/controller/rescue.rb +12 -12
  7. data/lib/controller/responds_to_parent.rb +5 -5
  8. data/lib/data_base/attachment.rb +60 -60
  9. data/lib/data_base/attachment/attach.rb +18 -18
  10. data/lib/data_base/attachment/geometry.rb +7 -7
  11. data/lib/data_base/attachment/iostream.rb +1 -1
  12. data/lib/data_base/attachment/processor.rb +2 -2
  13. data/lib/data_base/attachment/storage.rb +11 -11
  14. data/lib/data_base/attachment/thumbnail.rb +2 -2
  15. data/lib/data_base/attachment_table.rb +27 -27
  16. data/lib/data_base/translate_attributes.rb +9 -9
  17. data/lib/data_base/utility_scopes.rb +7 -7
  18. data/lib/data_base/without_table.rb +10 -10
  19. data/lib/generator.rb +4 -4
  20. data/lib/loops.rb +77 -77
  21. data/lib/loops/base.rb +2 -2
  22. data/lib/loops/daemonize.rb +5 -5
  23. data/lib/loops/process_manager.rb +3 -3
  24. data/lib/loops/worker.rb +1 -1
  25. data/lib/loops/worker_pool.rb +1 -1
  26. data/lib/mailer/exception_notifier.rb +5 -5
  27. data/lib/mailer/pdf_builder.rb +20 -18
  28. data/lib/utils/literal.rb +6 -6
  29. data/lib/utils/pdf_builder.rb +10 -10
  30. data/lib/version.rb +1 -1
  31. data/lib/view/helpers/backend_helper.rb +123 -123
  32. data/lib/view/helpers/ext/button.rb +7 -7
  33. data/lib/view/helpers/ext/column_model.rb +18 -18
  34. data/lib/view/helpers/ext/component.rb +50 -50
  35. data/lib/view/helpers/ext/configuration.rb +5 -5
  36. data/lib/view/helpers/ext/grid.rb +46 -46
  37. data/lib/view/helpers/ext/store.rb +14 -14
  38. data/lib/view/helpers/ext/tool_bar.rb +6 -6
  39. data/lib/view/helpers/ext_helper.rb +21 -21
  40. data/lib/view/helpers/frontend_helper.rb +5 -5
  41. data/lib/view/helpers/pdf_helper.rb +7 -7
  42. data/lib/view/helpers/view_helper.rb +28 -28
  43. data/lipsiadmin_generators/attachment/attachment_generator.rb +7 -7
  44. data/lipsiadmin_generators/attachment/templates/controller.rb +13 -13
  45. data/lipsiadmin_generators/attachment/templates/migration.rb +1 -1
  46. data/lipsiadmin_generators/backend/backend_generator.rb +9 -9
  47. data/lipsiadmin_generators/backend/templates/controllers/backend/accounts_controller.rb +10 -10
  48. data/lipsiadmin_generators/backend/templates/controllers/backend/sessions_controller.rb +2 -2
  49. data/lipsiadmin_generators/backend/templates/controllers/javascripts_controller.rb +2 -2
  50. data/lipsiadmin_generators/backend/templates/migrations/create_accounts.rb +5 -5
  51. data/lipsiadmin_generators/backend/templates/models/account.rb +16 -16
  52. data/lipsiadmin_generators/backend/templates/models/account_access.rb +11 -11
  53. data/lipsiadmin_generators/backend/templates/models/notifier.rb +2 -2
  54. data/lipsiadmin_generators/backend_page/backend_page_generator.rb +22 -22
  55. data/lipsiadmin_generators/backend_page/templates/controller.rb +9 -9
  56. data/lipsiadmin_generators/backend_page/templates/functional_test.rb +10 -10
  57. data/lipsiadmin_generators/frontend/frontend_generator.rb +5 -5
  58. data/lipsiadmin_generators/frontend/templates/controllers/frontend/sessions_controller.rb +3 -3
  59. data/lipsiadmin_generators/loops/loops_generator.rb +2 -2
  60. data/lipsiadmin_generators/pdf/pdf_generator.rb +7 -7
  61. data/lipsiadmin_generators/state_session/state_session_generator.rb +9 -9
  62. data/lipsiadmin_generators/state_session/templates/controller.rb +2 -2
  63. data/lipsiadmin_generators/state_session/templates/migration.rb +2 -2
  64. data/resources/rdoc/horo.rb +3 -3
  65. metadata +4 -4
@@ -3,32 +3,32 @@ module Lipsiadmin
3
3
  # This provide a simple login for backend and frontend.
4
4
  # Use backend_login_required in backend and
5
5
  # frontend_login_requirded in frontend.
6
- #
6
+ #
7
7
  # Examples:
8
- #
8
+ #
9
9
  # class FrontendController < ApplicationController
10
10
  # before_filter :frontend_login_required, :except => [:login]
11
11
  # end
12
- #
12
+ #
13
13
  module Authentication
14
14
  protected
15
-
15
+
16
16
  # Returns true if <tt>current_account</tt> is logged and active.
17
17
  def logged_in?
18
18
  current_account != :false && current_account.active?
19
19
  end
20
-
20
+
21
21
  # Returns the current_account, it's an instance of <tt>Account</tt> model
22
22
  def current_account
23
23
  @current_account ||= (login_from_session || :false)
24
24
  end
25
-
25
+
26
26
  # Ovverride the current_account, you must provide an instance of Account Model
27
- #
27
+ #
28
28
  # Examples:
29
- #
29
+ #
30
30
  # current_account = Account.last
31
- #
31
+ #
32
32
  def current_account=(new_account)
33
33
  session[:account] = (new_account.nil? || new_account.is_a?(Symbol)) ? nil : new_account.id
34
34
  @current_account = new_account
@@ -36,42 +36,42 @@ module Lipsiadmin
36
36
 
37
37
  # Returns true if the <tt>current_account</tt> is allowed to see the requested
38
38
  # controller/action.
39
- #
39
+ #
40
40
  # For configure this role please refer to: <tt>Lipsiadmin::AccessControl::Base</tt>
41
41
  def allowed?
42
42
  maps = AccountAccess.maps_for(current_account)
43
-
43
+
44
44
  allowed = maps.collect(&:allowed).flatten.uniq
45
45
  denied = maps.collect(&:denied).flatten.uniq
46
-
46
+
47
47
  allow = allowed.find do |a|
48
48
  a[:controller] == params[:controller] &&
49
49
  (a[:action].blank? || a[:action] == params[:action])
50
50
  end
51
-
51
+
52
52
  deny = denied.find do |a|
53
53
  a[:controller] == params[:controller] &&
54
54
  (a[:action].blank? || a[:action] == params[:action])
55
55
  end
56
-
56
+
57
57
  return allow && !deny
58
58
  end
59
-
59
+
60
60
  # Returns a helper to pass in a <tt>before_filter</tt> for check if
61
61
  # an account are: <tt>logged_in?</tt> and <tt>allowed?</tt>
62
- #
62
+ #
63
63
  # By default this method is used in BackendController so is not necessary
64
64
  def backend_login_required
65
65
  logged_in? && allowed? || access_denied(:backend)
66
66
  end
67
-
67
+
68
68
  # Returns a helper to pass in a <tt>before_filter</tt> for check if
69
69
  # an account are: <tt>logged_in?</tt> and <tt>allowed?</tt>
70
70
  #
71
71
  # Examples:
72
- #
72
+ #
73
73
  # before_filter :frontend_login_required, :except => [:some]
74
- #
74
+ #
75
75
  def frontend_login_required
76
76
  logged_in? && allowed? || access_denied(:frontend)
77
77
  end
@@ -87,7 +87,7 @@ module Lipsiadmin
87
87
  def store_location#:nodoc:
88
88
  session[:return_to] = request.request_uri
89
89
  end
90
-
90
+
91
91
  # Redirect the account to the page that requested an authentication or
92
92
  # if the account is not allowed/logged return it to a default page
93
93
  def redirect_back_or_default(default)
@@ -9,15 +9,15 @@ module Lipsiadmin
9
9
  end
10
10
  end
11
11
  end
12
-
12
+
13
13
  # This Class map and get roles/projects for accounts
14
- #
14
+ #
15
15
  # Examples:
16
- #
16
+ #
17
17
  # roles_for :administrator do |role, current_account|
18
18
  # role.allow_all_actions "/backend/base"
19
19
  # role.deny_action_of "/backend/accounts/details"
20
- #
20
+ #
21
21
  # role.project_module :administration do |project|
22
22
  # project.menu :general_settings, "/backend/settings" do |submenu|
23
23
  # submenu.add :accounts, "/backend/accounts" do |submenu|
@@ -25,29 +25,29 @@ module Lipsiadmin
25
25
  # end
26
26
  # end
27
27
  # end
28
- #
28
+ #
29
29
  # role.project_module :categories do |project|
30
30
  # current_account.categories.each do |cat|
31
31
  # project.menu cat.name, "/backend/categories/#{cat.id}.js"
32
32
  # end
33
33
  # end
34
34
  # end
35
- #
35
+ #
36
36
  # If a user logged with role administrator or that have a project_module administrator can:
37
- #
37
+ #
38
38
  # - Access in all actions of "/backend/base" controller
39
39
  # - Denied access to ONLY action <tt>"/backend/accounts/details"</tt>
40
40
  # - Access to a project module called Administration
41
41
  # - Access to all actions of the controller "/backend/settings"
42
42
  # - Access to all actions of the controller "/backend/categories"
43
43
  # - Access to all actions EXCEPT <tt>details</tt> of controller "/backend/accounts"
44
- #
44
+ #
45
45
  class Base
46
46
  @@cache = {}
47
47
  cattr_accessor :cache
48
-
48
+
49
49
  class << self
50
-
50
+
51
51
  # We map project modules for a given role or roles
52
52
  def roles_for(*roles, &block)
53
53
  roles.each { |role| raise AccessControlError, "Role #{role} must be a symbol!" unless role.is_a?(Symbol) }
@@ -56,7 +56,7 @@ module Lipsiadmin
56
56
  @roles.concat(roles)
57
57
  @mappers << Proc.new { |account| Mapper.new(account, *roles, &block) }
58
58
  end
59
-
59
+
60
60
  # Returns all roles
61
61
  def roles
62
62
  @roles.nil? ? [] : @roles.collect(&:to_s)
@@ -70,11 +70,11 @@ module Lipsiadmin
70
70
  end
71
71
  end
72
72
  end
73
-
73
+
74
74
  class Mapper
75
75
  include Helper
76
76
  attr_reader :project_modules, :roles
77
-
77
+
78
78
  def initialize(account, *roles, &block)#:nodoc:
79
79
  @project_modules = []
80
80
  @allowed = []
@@ -84,59 +84,59 @@ module Lipsiadmin
84
84
  # Mantain backward compatibility
85
85
  yield(self, Account.find(@account_id)) rescue yield(self)
86
86
  end
87
-
87
+
88
88
  # Create a new project module
89
89
  def project_module(name, controller=nil, &block)
90
90
  @project_modules << ProjectModule.new(name, controller, &block)
91
91
  end
92
-
92
+
93
93
  # Globally allow an action of a controller for the current role
94
94
  def allow_action(path)
95
95
  @allowed << recognize_path(path)
96
96
  end
97
-
97
+
98
98
  # Globally deny an action of a controllerfor the current role
99
99
  def deny_action(path)
100
100
  @denied << recognize_path(path)
101
101
  end
102
-
102
+
103
103
  # Globally allow all actions from a controller for the current role
104
104
  def allow_all_actions(path)
105
105
  @allowed << { :controller => recognize_path(path)[:controller] }
106
106
  end
107
-
107
+
108
108
  # Globally denty all actions from a controller for the current role
109
109
  def deny_all_actions(path)
110
110
  @denied << { :controller => recognize_path(path)[:controller] }
111
111
  end
112
-
112
+
113
113
  # Return true if current_account role is included in given roles
114
114
  def allowed?
115
115
  @roles.any? { |r| r.to_s.downcase == Account.find(@account_id).role.downcase }
116
116
  end
117
-
117
+
118
118
  # Return allowed actions/controllers
119
119
  def allowed
120
120
  # I know is a double check but is better 2 times that no one.
121
121
  if allowed?
122
122
  @project_modules.each { |pm| @allowed.concat pm.allowed }
123
123
  @allowed.uniq
124
- else
124
+ else
125
125
  []
126
126
  end
127
127
  end
128
-
128
+
129
129
  # Return denied actions/controllers
130
130
  def denied
131
131
  @denied.uniq
132
132
  end
133
133
  end
134
-
134
+
135
135
  class ProjectModule
136
136
  include Helper
137
137
  include ActionController::UrlWriter
138
138
  attr_reader :name, :menus, :url
139
-
139
+
140
140
  def initialize(name, path=nil, options={}, &block)#:nodoc:
141
141
  @name = name
142
142
  @options = options
@@ -148,28 +148,28 @@ module Lipsiadmin
148
148
  end
149
149
  yield self
150
150
  end
151
-
151
+
152
152
  # Build a new menu and automaitcally add the action on the allowed actions.
153
153
  def menu(name, path=nil, options={}, &block)
154
154
  @menus << Menu.new(name, path, options, &block)
155
155
  end
156
-
156
+
157
157
  # Return allowed controllers
158
158
  def allowed
159
159
  @menus.each { |m| @allowed.concat(m.allowed) }
160
160
  @allowed.uniq
161
161
  end
162
-
162
+
163
163
  # Return the original name or try to translate or humanize the symbol
164
164
  def human_name
165
165
  @name.is_a?(Symbol) ? I18n.t("backend.menus.#{@name}", :default => @name.to_s.humanize) : @name
166
166
  end
167
-
167
+
168
168
  # Return a unique id for the given project module
169
169
  def uid
170
170
  @name.to_s.downcase.gsub(/[^a-z0-9]+/, '').gsub(/-+$/, '').gsub(/^-+$/, '')
171
171
  end
172
-
172
+
173
173
  # Return ExtJs Config for this project module
174
174
  def config
175
175
  options = @options.merge(:text => human_name)
@@ -178,48 +178,48 @@ module Lipsiadmin
178
178
  options
179
179
  end
180
180
  end
181
-
181
+
182
182
  class Menu
183
183
  include Helper
184
184
  include ActionController::UrlWriter
185
185
  attr_reader :name, :options, :items
186
-
186
+
187
187
  def initialize(name, path=nil, options={}, &block)#:nodoc:
188
188
  @name = name
189
189
  @url = path
190
190
  @options = options
191
191
  @allowed = []
192
- @items = []
192
+ @items = []
193
193
  @allowed << { :controller => recognize_path(path)[:controller] } if @url
194
194
  yield self if block_given?
195
195
  end
196
-
196
+
197
197
  # Return the url of this menu
198
198
  def url
199
199
  @url.is_a?(Hash) ? url_for(@url.merge(:only_path => true)) : @url
200
200
  end
201
-
201
+
202
202
  # Add a new submenu to the menu
203
203
  def add(name, path=nil, options={}, &block)
204
204
  @items << Menu.new(name, path, options, &block)
205
205
  end
206
-
206
+
207
207
  # Return allowed controllers
208
208
  def allowed
209
209
  @items.each { |i| @allowed.concat i.allowed }
210
210
  @allowed.uniq
211
211
  end
212
-
212
+
213
213
  # Return the original name or try to translate or humanize the symbol
214
214
  def human_name
215
215
  @name.is_a?(Symbol) ? I18n.t("backend.menus.#{@name}", :default => @name.to_s.humanize) : @name
216
216
  end
217
-
217
+
218
218
  # Return a unique id for the given project module
219
219
  def uid
220
220
  @name.to_s.downcase.gsub(/[^a-z0-9]+/, '').gsub(/-+$/, '').gsub(/^-+$/, '')
221
221
  end
222
-
222
+
223
223
  # Return ExtJs Config for this menu
224
224
  def config
225
225
  if @url.blank? && @items.empty?
@@ -232,8 +232,8 @@ module Lipsiadmin
232
232
  options
233
233
  end
234
234
  end
235
-
235
+
236
236
  class AccessControlError < StandardError#:nodoc:
237
237
  end
238
238
  end
239
- end
239
+ end
@@ -2,13 +2,13 @@ module Lipsiadmin
2
2
  module Controller
3
3
  module Ext
4
4
  # Return column config, and store config/data for ExtJS ColumnModel and Store
5
- #
5
+ #
6
6
  # Examples:
7
- #
7
+ #
8
8
  # # app/controllers/backend/debtors_controller.rb
9
9
  # def index
10
10
  # @column_store = column_store_for Debtor do |cm|
11
- # cm.add :id
11
+ # cm.add :id
12
12
  # cm.add "full_name_or_company.upcase", "Full Name", :sortable => true, :dataIndex => :company
13
13
  # cm.add :surname # Header will be autogenerated
14
14
  # cm.add :email, "Email", :sortable => true
@@ -16,12 +16,12 @@ module Lipsiadmin
16
16
  # cm.add :created_at, "Creato il", :sortable => true, :renderer => :date, :align => :right
17
17
  # cm.add :updated_at, "Aggiornato il", :sortable => true, :renderer => :datetime, :align => :right
18
18
  # end
19
- #
19
+ #
20
20
  # respond_to do |format|
21
- # format.js
21
+ # format.js
22
22
  # format.json do
23
23
  # render :json => @column_store.store_data(params)
24
- #
24
+ #
25
25
  # # or you can manually do:
26
26
  # # debtors = Debtor.search(params)
27
27
  # # debtors_count = debtors.size
@@ -30,7 +30,7 @@ module Lipsiadmin
30
30
  # end
31
31
  # end
32
32
  # end
33
- #
33
+ #
34
34
  # # app/views/backend/index.rjs
35
35
  # page.grid do |grid|
36
36
  # grid.id "debtors-grid" # If you don't set this columns are not saved in cookies
@@ -48,11 +48,11 @@ module Lipsiadmin
48
48
  # end
49
49
  # grid.bbar :store => grid.get_store, :pageSize => params[:limit] # Remember to add after defining store!
50
50
  # end
51
- #
51
+ #
52
52
  def column_store_for(model, &block)
53
53
  ColumnStore.new(model, &block)
54
54
  end
55
-
55
+
56
56
  class ColumnStore#:nodoc:
57
57
  attr_reader :data
58
58
 
@@ -66,26 +66,26 @@ module Lipsiadmin
66
66
  def add(*args)
67
67
  options = { :method => args[0] }
68
68
  options[:header] = args[1].is_a?(String) || args[1].is_a?(Symbol) ? args[1].to_s : nil
69
-
69
+
70
70
  args.each { |a| options.merge!(a) if a.is_a?(Hash) }
71
-
71
+
72
72
  # Add some defaults
73
73
  options[:header] ||= options[:method].to_s
74
74
  options[:sortable] = options[:sortable].nil? ? true : options[:sortable]
75
-
75
+
76
76
  # Try to translate header
77
77
  options[:header] = @model.human_attribute_name(options[:header].to_s)
78
-
78
+
79
79
  # Reformat DataIndex
80
80
  if options[:dataIndex].is_a?(Array)
81
- options[:dataIndex] = options[:dataIndex].collect do |f|
82
- f.is_a?(Symbol) ? "#{@model.table_name}.#{f}" : f
81
+ options[:dataIndex] = options[:dataIndex].collect do |f|
82
+ f.is_a?(Symbol) ? "#{@model.table_name}.#{f}" : f
83
83
  end.join(",")
84
84
  end
85
-
85
+
86
86
  # Adding a name for our column
87
87
  options[:name] ||= "#{@model.table_name.singularize}[#{options[:method]}]"
88
-
88
+
89
89
  # Reformat query
90
90
  if options[:method].is_a?(Symbol)
91
91
  options[:dataIndex] ||= "#{@model.table_name}.#{options[:method]}"
@@ -100,14 +100,14 @@ module Lipsiadmin
100
100
  options[:dataIndex] ||= columns[0..columns.length-2].collect(&:pluralize).join(".") + "." + columns.at(columns.size-1)
101
101
  end
102
102
  end
103
-
103
+
104
104
  # Reformat dataIndex
105
105
  options[:mapping] ||= options[:dataIndex].to_s.downcase.gsub(/[^a-z0-9]+/, '_').
106
106
  gsub(/-+$/, '_').
107
107
  gsub(/^-+$/, '_')
108
108
  # Now is necessary for our columns an ID
109
109
  options[:id] = options[:mapping]
110
-
110
+
111
111
  @data << options
112
112
  end
113
113
 
@@ -122,18 +122,18 @@ module Lipsiadmin
122
122
  fields
123
123
  end
124
124
  end
125
-
125
+
126
126
  # Return an array config for build an Ext.data.GroupingStore()
127
127
  def store_fields
128
128
  @data.inject([]) do |fields, data|
129
129
  hash = { :name => data[:dataIndex], :mapping => data[:mapping] }
130
- hash.merge!(:type => data[:renderer]) if data[:renderer] &&
130
+ hash.merge!(:type => data[:renderer]) if data[:renderer] &&
131
131
  (data[:renderer] == :date || data[:renderer] == :datetime || data[:renderer] == :time_to_date)
132
132
  fields << hash
133
133
  fields
134
134
  end
135
135
  end
136
-
136
+
137
137
  # Return data for a custom collection for the ExtJS Ext.data.GroupingStore() json
138
138
  def store_data_from(collection)
139
139
  collection.inject([]) do |store, c|
@@ -144,15 +144,15 @@ module Lipsiadmin
144
144
  store
145
145
  end
146
146
  end
147
-
147
+
148
148
  # Return a searched and paginated data collection for the ExtJS Ext.data.GroupingStore() json
149
149
  # You can pass options like:
150
- #
150
+ #
151
151
  # Examples
152
- #
152
+ #
153
153
  # store_data(params, :conditions => "found = 1")
154
154
  # store_data(params, :include => :posts)
155
- #
155
+ #
156
156
  def store_data(params, options={})
157
157
  # Some can tell me that this method made two identical queries one for count one for paginate.
158
158
  # We don't use the select count because in some circumstances require much time than select *.
@@ -167,4 +167,4 @@ module Lipsiadmin
167
167
  end
168
168
  end
169
169
  end
170
- end
170
+ end