qm-acts-as-generic-controller 0.1.21 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -2
- data/app/views/generic_controller/index.erb +1 -1
- data/app/views/generic_controller/show.erb +1 -1
- data/lib/qm-acts-as-generic-controller-controller.rb +1 -1
- data/lib/qm-acts-as-generic-controller-model.rb +55 -11
- data/lib/qm-acts-as-generic-controller-view.rb +79 -0
- metadata +10 -10
data/Rakefile
CHANGED
@@ -10,10 +10,10 @@ begin
|
|
10
10
|
gemspec.email = "marcin@saepia.net"
|
11
11
|
gemspec.homepage = "http://q.saepia.net"
|
12
12
|
gemspec.authors = ["Marcin Lewandowski"]
|
13
|
-
gemspec.version = "0.
|
13
|
+
gemspec.version = "0.2.0"
|
14
14
|
gemspec.files = Rake::FileList.new [ "MIT-LICENSE", "Rakefile", "lib/*", "app/views/generic_controller/*" ]
|
15
15
|
gemspec.add_dependency "qui-common-helpers", ">= 0.0.8"
|
16
|
-
gemspec.add_dependency "qui-index-table", ">= 0.0.
|
16
|
+
gemspec.add_dependency "qui-index-table", ">= 0.0.9"
|
17
17
|
gemspec.add_dependency "qui-tabs", ">= 0.0.3"
|
18
18
|
gemspec.add_dependency "qui-toolbar", ">= 0.0.5"
|
19
19
|
gemspec.add_dependency "rfc822"
|
@@ -81,7 +81,7 @@
|
|
81
81
|
<%= link_to t(:"toolbar.create"), polymorphic_path([ "new", section, v[:class_name].table_name.singularize ], { association_attribute => record.id, :association_attribute => association_attribute }), :class => "create" %>
|
82
82
|
<%- end -%>
|
83
83
|
|
84
|
-
<%=
|
84
|
+
<%= generic_index_table :records => record.send(k).limit_with_security_scheme(:user => current_user), :class_name => v[:class_name] %>
|
85
85
|
<%- tab_headers[k] = t(:"#{section_prefix}tabs.#{table_name}.#{k}") + " (#{record.send(k).limit_with_security_scheme(:user => current_user).size})" %>
|
86
86
|
<%- end -%>
|
87
87
|
|
@@ -36,7 +36,7 @@ module QM
|
|
36
36
|
module InstanceMethods
|
37
37
|
def index
|
38
38
|
unless instance_variable_defined?(plural_variable)
|
39
|
-
instance_variable_set(plural_variable, model.limit_with_security_scheme(:user => current_user))
|
39
|
+
instance_variable_set(plural_variable, model.limit_with_security_scheme(:user => current_user, :paginate => true, :paginate_page => params[:page] || 1, :paginate_per_page => params[:per_page] || 100, :sort_by => params[:sort_by], :sort_order => params[:sort_order]))
|
40
40
|
end
|
41
41
|
|
42
42
|
respond_to do |format|
|
@@ -8,37 +8,81 @@ module QM
|
|
8
8
|
module ClassMethods
|
9
9
|
def limit_with_security_scheme(options)
|
10
10
|
# options[:user] - current user that performs the query
|
11
|
+
# options[:paginate] - set to true if you want to enable pagination, not applicable for the ExternalSystem request
|
12
|
+
# options[:paginate_page] - set to integer
|
13
|
+
# options[:sort_by] - field to sort by
|
14
|
+
# options[:sort_order] - "A" or "D"
|
11
15
|
|
12
16
|
raise ArgumentError, "You must pass options[:user] to limit_with_security_scheme" unless options.has_key? :user
|
13
17
|
|
14
18
|
return all if options[:user].is_a? ExternalSystem
|
15
|
-
|
19
|
+
|
16
20
|
# Return empty set if user has no privileges at all (nor index_any and index_created)
|
17
21
|
unless options[:user].has_privileges?(:class_name => self, :generic_action => :index_any) or options[:user].has_privileges?(:class_name => self, :generic_action => :index_created)
|
18
|
-
# puts ":("
|
19
|
-
# puts options[:user].inspect
|
20
|
-
# puts self
|
21
|
-
# puts options[:user].has_privileges?(:class_name => self, :generic_action => :index_any)
|
22
|
-
# puts options[:user].has_privileges?(:class_name => self, :generic_action => :index_created)
|
23
|
-
# puts options[:user].has_privileges?(:class_name => self, :generic_action => :index_any) or options[:user].has_privileges?(:class_name => self, :generic_action => :index_created)
|
24
22
|
return []
|
25
23
|
end
|
26
24
|
|
27
25
|
creator_column = "creator_#{options[:user].class.to_s.tableize.singularize}_id"
|
28
26
|
should_limit_index_for_created = columns_hash.has_key?(creator_column) && options[:user].respond_to?(:has_privileges?) && !options[:user].has_privileges?(:class_name => self, :generic_action => :index_any) && options[:user].has_privileges?(:class_name => self, :generic_action => :index_created)
|
29
27
|
|
28
|
+
universal_find_params = {}
|
29
|
+
|
30
|
+
if options.has_key? :sort_by and not options[:sort_by].nil?
|
31
|
+
# Sorting
|
32
|
+
if options[:sort_order] == "A"
|
33
|
+
sort_direction = "ASC"
|
34
|
+
sort_opposite_direction = "DESC"
|
35
|
+
else
|
36
|
+
sort_direction = "DESC"
|
37
|
+
sort_opposite_direction = "ASC"
|
38
|
+
end
|
39
|
+
|
40
|
+
# FIXME what if this is not index?
|
41
|
+
generic_field = self.generic_fields[:index].detect{ |f| f[:name] == options[:sort_by].to_sym }
|
42
|
+
if generic_field and generic_field[:options].has_key? :sort_sql
|
43
|
+
universal_find_params[:order] = generic_field[:options][:sort_sql].gsub("%{DIRECTION}", sort_direction).gsub("%{OPPOSITE_DIRECTION}", sort_opposite_direction)
|
44
|
+
|
45
|
+
elsif self.columns_hash.has_key? options[:sort_by].to_s
|
46
|
+
universal_find_params[:order] = "#{options[:sort_by]} #{sort_direction}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
30
50
|
|
31
51
|
if respond_to? :limit_for_user
|
32
52
|
if should_limit_index_for_created
|
33
|
-
|
53
|
+
if defined? WillPaginate
|
54
|
+
logger.info "#{self}.limit_with_security_scheme: limit_for_user & limit_index_for_created & will_paginate(page = #{options[:paginate_page]}, per_page = #{options[:paginate_per_page]})"
|
55
|
+
limit_for_user(options[:user]).find(:all, universal_find_params).find(:all, :conditions => { creator_column => options[:user].id }).paginate(:page => options[:paginate_page], :per_page => options[:paginate_per_page])
|
56
|
+
else
|
57
|
+
logger.info "#{self}.limit_with_security_scheme: limit_for_user & limit_index_for_created"
|
58
|
+
limit_for_user(options[:user]).find(:all, universal_find_params).find(:all, :conditions => { creator_column => options[:user].id })
|
59
|
+
end
|
34
60
|
else
|
35
|
-
|
61
|
+
if defined? WillPaginate
|
62
|
+
logger.info "#{self}.limit_with_security_scheme: limit_for_user & will_paginate(page = #{options[:paginate_page]}, per_page = #{options[:paginate_per_page]})"
|
63
|
+
limit_for_user(options[:user]).find(:all, universal_find_params).paginate(:page => options[:paginate_page], :per_page => options[:paginate_per_page])
|
64
|
+
else
|
65
|
+
logger.info "#{self}.limit_with_security_scheme: limit_for_user"
|
66
|
+
limit_for_user(options[:user]).find(:all, universal_find_params)
|
67
|
+
end
|
36
68
|
end
|
37
69
|
else
|
38
70
|
if should_limit_index_for_created
|
39
|
-
|
71
|
+
if defined? WillPaginate
|
72
|
+
logger.info "#{self}.limit_with_security_scheme: limit_index_for_created & will_paginate(page = #{options[:paginate_page]}, per_page = #{options[:paginate_per_page]})"
|
73
|
+
find(:all, :conditions => { creator_column => options[:user].id }).find(:all, universal_find_params).paginate(:page => options[:paginate_page], :per_page => options[:paginate_per_page])
|
74
|
+
else
|
75
|
+
logger.info "#{self}.limit_with_security_scheme: limit_index_for_created"
|
76
|
+
find(:all, :conditions => { creator_column => options[:user].id }).find(:all, universal_find_params)
|
77
|
+
end
|
40
78
|
else
|
41
|
-
|
79
|
+
if defined? WillPaginate
|
80
|
+
logger.info "#{self}.limit_with_security_scheme: will_paginate(page = #{options[:paginate_page]}, per_page = #{options[:paginate_per_page]})"
|
81
|
+
find(:all, universal_find_params).paginate(:page => options[:paginate_page], :per_page => options[:paginate_per_page])
|
82
|
+
else
|
83
|
+
logger.info "#{self}.limit_with_security_scheme: (all)"
|
84
|
+
find(:all, universal_find_params)
|
85
|
+
end
|
42
86
|
end
|
43
87
|
end
|
44
88
|
end
|
@@ -36,6 +36,85 @@ module QM
|
|
36
36
|
|
37
37
|
result
|
38
38
|
end
|
39
|
+
|
40
|
+
def generic_index_table(options = {})
|
41
|
+
records = options[:records] || instance_variable_get("@#{@controller.class.to_s.demodulize.gsub("Controller", "").tableize}")
|
42
|
+
class_name = options[:class_name] || @controller.class.to_s.demodulize.gsub("Controller", "").singularize.constantize
|
43
|
+
|
44
|
+
privileged_fields = class_name.generic_fields(:action => :index).collect{|field| field if not current_user.respond_to? "has_privileges?" or (class_name.generic_field_associations.has_key?(field[:name]) and current_user.has_privileges?(:class_name => class_name.generic_field_associations[field[:name]][:class_name])) or (current_user.has_privileges?(:class_name => class_name, :attribute => field[:name], :mode => :read)) }.compact
|
45
|
+
|
46
|
+
headers = privileged_fields.collect{ |x| x[:options][:index_header] || ".#{x[:name]}".to_sym }
|
47
|
+
|
48
|
+
controller_name = "#{defined?(section) ? "#{section.to_s.camelize}::" : ""}#{class_name.to_s.pluralize}".tableize
|
49
|
+
|
50
|
+
has_edit = ActionController::Routing::Routes.routes.collect{|x| x if x.matches_controller_and_action?(controller_name, "edit") }.compact.size > 0
|
51
|
+
has_delete = ActionController::Routing::Routes.routes.collect{|x| x if x.matches_controller_and_action?(controller_name, "destroy") }.compact.size > 0
|
52
|
+
|
53
|
+
if current_user.respond_to? "has_privileges?"
|
54
|
+
has_edit = has_edit && current_user.has_privileges?(:class_name => class_name, :generic_action => :update_any)
|
55
|
+
has_delete = has_edit && current_user.has_privileges?(:class_name => class_name, :generic_action => :delete_any)
|
56
|
+
end
|
57
|
+
|
58
|
+
class_name.generic_actions(:action => :index).size.times{ headers << :oneicon }
|
59
|
+
|
60
|
+
headers << :oneicon if has_edit
|
61
|
+
headers << :oneicon if has_delete
|
62
|
+
|
63
|
+
|
64
|
+
index_table records, :headers => headers, :class_name => class_name do |r|
|
65
|
+
row = ""
|
66
|
+
|
67
|
+
privileged_fields.each do |field|
|
68
|
+
row << content_tag(:td) do
|
69
|
+
if field[:options].has_key? :renderer
|
70
|
+
send(field[:options][:renderer], { :record => r, :field => field, :action => :index }).to_s
|
71
|
+
else
|
72
|
+
generic_renderer(:index, { :record => r, :field => field }).to_s
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class_name.generic_actions(:action => :index).each do |action|
|
78
|
+
row << content_tag(:td, send(action[:options][:renderer], { :action => :index, :record => r, :action => :index, :generic_action => action }), :class => "action #{action[:name]}")
|
79
|
+
end
|
80
|
+
|
81
|
+
if has_edit
|
82
|
+
row << content_tag(:td, :class => "action edit") do
|
83
|
+
link_to_edit(r)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
if has_delete
|
88
|
+
row << content_tag(:td, :class => "action delete") do
|
89
|
+
link_to_delete(r)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
row
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def index_table_th(content, options = {})
|
98
|
+
if options[:sort_by]
|
99
|
+
content_tag(:th, index_table_th_sort(content, options), options)
|
100
|
+
else
|
101
|
+
content_tag(:th, content, options)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def index_table_th_sort(content, options = {})
|
106
|
+
c = ""
|
107
|
+
if params[:sort_by] == options[:sort_by]
|
108
|
+
if params[:sort_order] == "A"
|
109
|
+
c << image_tag("sort-asc.png", :alt => "^", :class => "sort-icon")
|
110
|
+
else
|
111
|
+
c << image_tag("sort-desc.png", :alt => "v", :class => "sort-icon")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
link_to(content + c, params.merge({ :sort_by => options[:sort_by], :sort_order => options[:sort_order]}))
|
116
|
+
end
|
117
|
+
|
39
118
|
|
40
119
|
def multiple_select(options = {})
|
41
120
|
options.symbolize_keys!
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qm-acts-as-generic-controller
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Marcin Lewandowski
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-02-07 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -42,12 +42,12 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ">="
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
45
|
+
hash: 13
|
46
46
|
segments:
|
47
47
|
- 0
|
48
48
|
- 0
|
49
|
-
-
|
50
|
-
version: 0.0.
|
49
|
+
- 9
|
50
|
+
version: 0.0.9
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
53
|
- !ruby/object:Gem::Dependency
|
@@ -150,8 +150,8 @@ homepage: http://q.saepia.net
|
|
150
150
|
licenses: []
|
151
151
|
|
152
152
|
post_install_message:
|
153
|
-
rdoc_options:
|
154
|
-
|
153
|
+
rdoc_options:
|
154
|
+
- --charset=UTF-8
|
155
155
|
require_paths:
|
156
156
|
- lib
|
157
157
|
required_ruby_version: !ruby/object:Gem::Requirement
|