the_jobbook_admin_data 1.3.0a
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/CHANGELOG.rdoc +284 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +121 -0
- data/Guardfile +14 -0
- data/MIT-LICENSE +20 -0
- data/README.md +37 -0
- data/README.rdoc +3 -0
- data/Rakefile +40 -0
- data/admin_data.gemspec +23 -0
- data/app/assets/images/add.png +0 -0
- data/app/assets/images/admin_data/.gitkeep +0 -0
- data/app/assets/images/no.png +0 -0
- data/app/assets/images/site.png +0 -0
- data/app/assets/images/sort_by_asc.jpg +0 -0
- data/app/assets/images/sort_by_desc.jpg +0 -0
- data/app/assets/images/sort_by_nothing.jpg +0 -0
- data/app/assets/javascripts/admin_data.js +18 -0
- data/app/assets/javascripts/admin_data/application.js +15 -0
- data/app/assets/javascripts/advance_search/act_on_result.js +45 -0
- data/app/assets/javascripts/advance_search/advance_search.js +83 -0
- data/app/assets/javascripts/advance_search/advance_search_structure.js +79 -0
- data/app/assets/javascripts/advance_search/ajaxify_advance_search.js +28 -0
- data/app/assets/javascripts/advance_search/build_first_row.js +8 -0
- data/app/assets/javascripts/advance_search/event_bindings.js +76 -0
- data/app/assets/javascripts/advance_search/global_ajax_setting.js +10 -0
- data/app/assets/javascripts/advance_search/sortby.js +14 -0
- data/app/assets/javascripts/advance_search/trigger_submit_on_domready.js +6 -0
- data/app/assets/javascripts/analytics/report.js +7 -0
- data/app/assets/javascripts/misc/drop_down_change.js +8 -0
- data/app/assets/javascripts/misc/js_util.js +58 -0
- data/app/assets/javascripts/misc/quick_search_input_focus.js +6 -0
- data/app/assets/javascripts/vendor/jquery-1.4.2.js +6240 -0
- data/app/assets/javascripts/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
- data/app/assets/javascripts/vendor/jquery.ba-isjquery.js +21 -0
- data/app/assets/javascripts/vendor/jquery_form.js +814 -0
- data/app/assets/javascripts/vendor/log.js +9 -0
- data/app/assets/javascripts/vendor/rails.js +132 -0
- data/app/assets/stylesheets/admin_data.css +1141 -0
- data/app/assets/stylesheets/admin_data/application.css +13 -0
- data/app/assets/stylesheets/vendor/jquery-ui-1.7.2.custom.css +406 -0
- data/app/controllers/admin_data/application_controller.rb +107 -0
- data/app/controllers/admin_data/crud_controller.rb +100 -0
- data/app/controllers/admin_data/feed_controller.rb +48 -0
- data/app/controllers/admin_data/home_controller.rb +8 -0
- data/app/controllers/admin_data/migration_controller.rb +18 -0
- data/app/controllers/admin_data/public_controller.rb +28 -0
- data/app/controllers/admin_data/search_controller.rb +143 -0
- data/app/controllers/admin_data/table_structure_controller.rb +25 -0
- data/app/helpers/admin_data/application_helper.rb +320 -0
- data/app/views/admin_data/crud/association/_association_info.html.erb +11 -0
- data/app/views/admin_data/crud/association/_belongs_to_info.html.erb +7 -0
- data/app/views/admin_data/crud/association/_habtm_info.html.erb +7 -0
- data/app/views/admin_data/crud/association/_has_many_info.html.erb +7 -0
- data/app/views/admin_data/crud/association/_has_one_info.html.erb +6 -0
- data/app/views/admin_data/crud/edit.html.erb +36 -0
- data/app/views/admin_data/crud/misc/_form.html.erb +38 -0
- data/app/views/admin_data/crud/misc/_modify_record.html.erb +18 -0
- data/app/views/admin_data/crud/new.html.erb +25 -0
- data/app/views/admin_data/crud/show.html.erb +42 -0
- data/app/views/admin_data/feed/index.rss.builder +25 -0
- data/app/views/admin_data/home/index.html.erb +21 -0
- data/app/views/admin_data/migration/index.html.erb +18 -0
- data/app/views/admin_data/migration/jstest.html.erb +51 -0
- data/app/views/admin_data/search/advance_search.html.erb +1 -0
- data/app/views/admin_data/search/quick_search.html.erb +1 -0
- data/app/views/admin_data/search/search/_advance_search_form.html.erb +52 -0
- data/app/views/admin_data/search/search/_errors.html.erb +5 -0
- data/app/views/admin_data/search/search/_listing.html.erb +43 -0
- data/app/views/admin_data/search/search/_search_form.html.erb +27 -0
- data/app/views/admin_data/search/search/_title.html.erb +34 -0
- data/app/views/admin_data/shared/_breadcrum.html.erb +16 -0
- data/app/views/admin_data/shared/_drop_down_klasses.html.erb +4 -0
- data/app/views/admin_data/shared/_flash_message.html.erb +13 -0
- data/app/views/admin_data/shared/_header.html.erb +20 -0
- data/app/views/admin_data/shared/_powered_by.html.erb +6 -0
- data/app/views/admin_data/shared/_secondary_navigation.html.erb +26 -0
- data/app/views/admin_data/table_structure/index.html.erb +54 -0
- data/app/views/layouts/admin_data.html.erb +34 -0
- data/app/views/layouts/admin_data/application.html.erb +14 -0
- data/app/views/layouts/search.html.erb +71 -0
- data/config/routes.rb +32 -0
- data/lib/admin_data.rb +27 -0
- data/lib/admin_data/active_record_util.rb +102 -0
- data/lib/admin_data/analytics.rb +176 -0
- data/lib/admin_data/authenticator.rb +15 -0
- data/lib/admin_data/config.rb +38 -0
- data/lib/admin_data/configuration.rb +127 -0
- data/lib/admin_data/date_util.rb +58 -0
- data/lib/admin_data/engine.rb +17 -0
- data/lib/admin_data/model_finder.rb +15 -0
- data/lib/admin_data/rails_version_check.rb +8 -0
- data/lib/admin_data/search.rb +188 -0
- data/lib/admin_data/setup_config.rb +24 -0
- data/lib/admin_data/util.rb +102 -0
- data/lib/admin_data/version.rb +3 -0
- data/lib/tasks/admin_data_tasks.rake +4 -0
- data/script/rails +8 -0
- data/test/admin_data_test.rb +7 -0
- data/test/dummy/README.md +19 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +5 -0
- data/test/dummy/app/models/user.rb +3 -0
- data/test/dummy/app/models/user/student.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +15 -0
- data/test/dummy/config/boot.rb +13 -0
- data/test/dummy/config/cucumber.yml +9 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/database.yml.mysql +22 -0
- data/test/dummy/config/database.yml.pg +15 -0
- data/test/dummy/config/database.yml.sqlite3 +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +22 -0
- data/test/dummy/config/environments/production.rb +49 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/admin_data.rb +15 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/empty_spaces_to_nil.rb +10 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +9 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20091030202259_create_tables.rb +72 -0
- data/test/dummy/db/production.sqlite3 +1 -0
- data/test/dummy/db/schema.rb +23 -0
- data/test/dummy/db/seeds.rb +40 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/features/advance_search/boolean.feature +74 -0
- data/test/dummy/features/advance_search/datetime.feature +101 -0
- data/test/dummy/features/advance_search/delete_all.feature +20 -0
- data/test/dummy/features/advance_search/destroy_all.feature +20 -0
- data/test/dummy/features/advance_search/integer.feature +69 -0
- data/test/dummy/features/advance_search/multiple_rows.feature +87 -0
- data/test/dummy/features/advance_search/string.feature +130 -0
- data/test/dummy/features/crud.feature +50 -0
- data/test/dummy/features/crud_show.feature +56 -0
- data/test/dummy/features/feed.feature +13 -0
- data/test/dummy/features/home.feature +42 -0
- data/test/dummy/features/migration.feature +7 -0
- data/test/dummy/features/quick_search.feature +113 -0
- data/test/dummy/features/step_definitions/advance_search_steps.rb +13 -0
- data/test/dummy/features/step_definitions/app_steps.rb +36 -0
- data/test/dummy/features/step_definitions/async.rb +18 -0
- data/test/dummy/features/step_definitions/configuration_steps.rb +61 -0
- data/test/dummy/features/step_definitions/crud_show_steps.rb +37 -0
- data/test/dummy/features/step_definitions/feed_steps.rb +24 -0
- data/test/dummy/features/step_definitions/quick_search_steps.rb +68 -0
- data/test/dummy/features/step_definitions/util.rb +90 -0
- data/test/dummy/features/step_definitions/web_steps.rb +219 -0
- data/test/dummy/features/support/env.rb +66 -0
- data/test/dummy/features/support/hooks.rb +9 -0
- data/test/dummy/features/support/paths.rb +33 -0
- data/test/dummy/features/table_structure.feature +18 -0
- data/test/dummy/lib/tasks/.gitkeep +0 -0
- data/test/dummy/lib/tasks/cucumber.rake +53 -0
- data/test/dummy/lib/tasks/dbs.rake +30 -0
- data/test/dummy/lib/tasks/sample_cars.rake +18 -0
- data/test/dummy/public/.gitkeep +0 -0
- data/test/dummy/script/cucumber +10 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/factories.rb +30 -0
- data/test/dummy/test/test_helper.rb +7 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/admin_data/model_finder_test.rb +16 -0
- data/test/unit/car_test.rb +96 -0
- data/test/unit/user_phone_test.rb +19 -0
- metadata +253 -0
@@ -0,0 +1,176 @@
|
|
1
|
+
require "active_support/all"
|
2
|
+
|
3
|
+
module AdminData
|
4
|
+
module Analytics
|
5
|
+
|
6
|
+
# a utility class to handle date interpolation for different databases
|
7
|
+
class Dater
|
8
|
+
attr_accessor :adapter, :type
|
9
|
+
|
10
|
+
def initialize(adapter, type = 'daily')
|
11
|
+
@adapter = adapter
|
12
|
+
@type = type
|
13
|
+
end
|
14
|
+
|
15
|
+
def date_select_key
|
16
|
+
"date_data"
|
17
|
+
end
|
18
|
+
|
19
|
+
def group_by_key
|
20
|
+
if adapter =~ /postgresql/i
|
21
|
+
self.type == 'monthly' ? "date_part('year', created_at), date_part('month', created_at)" : "date_data"
|
22
|
+
elsif adapter =~ /mysql/i
|
23
|
+
self.type == 'monthly' ? "YEAR(created_at), MONTH(created_at)" : "date_data"
|
24
|
+
else
|
25
|
+
self.type == 'monthly' ? "strftime('%Y', created_at), strftime('%m', created_at)" : "date_data"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def count_select_key
|
30
|
+
"count_data"
|
31
|
+
end
|
32
|
+
|
33
|
+
def count_function
|
34
|
+
"count(*) as count_data"
|
35
|
+
end
|
36
|
+
|
37
|
+
def date_select_function
|
38
|
+
self.type == 'monthly' ? date_select_function_monthly : date_select_function_daily
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def date_select_function_monthly
|
44
|
+
if adapter =~ /mysql/i
|
45
|
+
"MONTH(created_at) as date_data"
|
46
|
+
elsif adapter =~ /postgresql/i
|
47
|
+
"date_part('month', created_at) as date_data"
|
48
|
+
else
|
49
|
+
"strftime('%m', created_at) as date_data"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def date_select_function_daily
|
54
|
+
if adapter =~ /mysql/i
|
55
|
+
"date_format(created_at, '%Y-%m-%d') as date_data"
|
56
|
+
else
|
57
|
+
"date(created_at) as date_data"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.monthly_report(klass, end_date)
|
64
|
+
begin_date = end_date.ago(1.year)
|
65
|
+
raise "begin_date should not be after end_date" if begin_date > end_date
|
66
|
+
raise AdminData::NoCreatedAtColumnException unless klass.columns.find {|r| r.name == 'created_at'}
|
67
|
+
|
68
|
+
begin_date = begin_date.beginning_of_day
|
69
|
+
end_date = end_date.end_of_day
|
70
|
+
|
71
|
+
dater = Dater.new(ActiveRecord::Base.connection.adapter_name, 'monthly')
|
72
|
+
|
73
|
+
query = klass.unscoped
|
74
|
+
query = query.where(["created_at >= ?", begin_date])
|
75
|
+
query = query.where(["created_at <= ?", end_date])
|
76
|
+
query = query.group(dater.group_by_key)
|
77
|
+
query = query.select(dater.date_select_function)
|
78
|
+
query = query.select(dater.count_function)
|
79
|
+
debug "sql: " + query.to_sql
|
80
|
+
result = query.all
|
81
|
+
debug "sql result: #{result.inspect}"
|
82
|
+
|
83
|
+
extract_data_from_result_set_monthly(result, dater, begin_date, end_date)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.extract_data_from_result_set_monthly(result, dater, begin_date, end_date)
|
87
|
+
debug "extracting from result set now"
|
88
|
+
result_hash = {}
|
89
|
+
result.each do |record|
|
90
|
+
result_hash.merge!(record[dater.date_select_key].to_i => record[dater.count_select_key])
|
91
|
+
end
|
92
|
+
|
93
|
+
debug "result_hash.inspect is #{result_hash.inspect}"
|
94
|
+
|
95
|
+
current_month = begin_date.strftime('%m').to_i
|
96
|
+
months_order = (1..current_month).to_a.reverse + (current_month..12).to_a.reverse
|
97
|
+
months_order.uniq!.reverse!
|
98
|
+
|
99
|
+
debug "months order is #{months_order.inspect}"
|
100
|
+
|
101
|
+
final_hash = ActiveSupport::OrderedHash.new
|
102
|
+
months_order.each do |month|
|
103
|
+
month = month.to_i #sqlite3 has months as 03 instead of 3
|
104
|
+
m = Time.now.change(:month => month)
|
105
|
+
m = m.ago(1.year) if month > current_month
|
106
|
+
|
107
|
+
key = m.strftime('%b-%Y')
|
108
|
+
key = "'#{key}'"
|
109
|
+
if dater.adapter =~ /postgresql/i
|
110
|
+
value = result_hash[month]
|
111
|
+
elsif dater.adapter =~ /mysql/i
|
112
|
+
value = result_hash[month]
|
113
|
+
else
|
114
|
+
value = result_hash[month]
|
115
|
+
end
|
116
|
+
value = value.to_i
|
117
|
+
debug "month: #{month} key: #{key} value: #{value}"
|
118
|
+
final_hash.merge!(key => value)
|
119
|
+
end
|
120
|
+
|
121
|
+
final_hash.to_a.tap {|e| debug e.inspect }
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.daily_report(klass, end_date)
|
125
|
+
begin_date = end_date.ago(1.month)
|
126
|
+
raise "begin_date should not be after end_date" if begin_date > end_date
|
127
|
+
raise AdminData::NoCreatedAtColumnException unless klass.columns.find {|r| r.name == 'created_at'}
|
128
|
+
|
129
|
+
begin_date = begin_date.beginning_of_day
|
130
|
+
end_date = end_date.end_of_day
|
131
|
+
|
132
|
+
dater = Dater.new(ActiveRecord::Base.connection.adapter_name)
|
133
|
+
|
134
|
+
query = klass.unscoped
|
135
|
+
query = query.where(["created_at >= ?", begin_date])
|
136
|
+
query = query.where(["created_at <= ?", end_date])
|
137
|
+
query = query.group(dater.group_by_key)
|
138
|
+
query = query.select(dater.date_select_function)
|
139
|
+
query = query.select(dater.count_function)
|
140
|
+
debug "sql: " + query.to_sql
|
141
|
+
result = query.all
|
142
|
+
debug "sql result: #{result.inspect}"
|
143
|
+
|
144
|
+
extract_data_from_result_set_daily(result, dater, begin_date, end_date).tap {|e| debug "formatted output: "+e.inspect}
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.extract_data_from_result_set_daily(result, dater, begin_date, end_date)
|
148
|
+
count = result.map {|r| r[dater.count_select_key] }
|
149
|
+
dates = result.map {|r| r[dater.date_select_key] }
|
150
|
+
|
151
|
+
debug "count is: #{count.inspect}"
|
152
|
+
debug "dates is: #{dates.inspect}"
|
153
|
+
|
154
|
+
final_output= []
|
155
|
+
|
156
|
+
while(begin_date) do
|
157
|
+
s = begin_date.strftime('%Y-%m-%d')
|
158
|
+
final_count = if index = dates.index(s)
|
159
|
+
count[index].to_i
|
160
|
+
else
|
161
|
+
0
|
162
|
+
end
|
163
|
+
final_output << ["'#{s}'", final_count]
|
164
|
+
begin_date = begin_date.tomorrow
|
165
|
+
break if begin_date > end_date
|
166
|
+
end
|
167
|
+
final_output
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.debug(msg)
|
171
|
+
puts msg
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# HttpBasic authenticator for feed authentication
|
2
|
+
module AdminData
|
3
|
+
class Authenticator
|
4
|
+
|
5
|
+
def initialize(userid, password)
|
6
|
+
@userid = userid
|
7
|
+
@password = password
|
8
|
+
end
|
9
|
+
|
10
|
+
def verify(controller)
|
11
|
+
controller.authenticate_or_request_with_http_basic { |_u, _p| (_u == @userid) && (_p == @password) }
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Following code takes care of providing a nice error
|
2
|
+
# message to users who are using old API
|
3
|
+
module AdminData
|
4
|
+
|
5
|
+
class Config
|
6
|
+
cattr_accessor :setting
|
7
|
+
|
8
|
+
def self.set=(input = {})
|
9
|
+
|
10
|
+
msg=<<EOF
|
11
|
+
|
12
|
+
AdminData API has changed in version 1.1 .
|
13
|
+
|
14
|
+
The changes are very minor.
|
15
|
+
|
16
|
+
Instead of
|
17
|
+
|
18
|
+
AdminData::Config.set = {
|
19
|
+
:find_conditions => ....
|
20
|
+
}
|
21
|
+
|
22
|
+
Now you need to write in following style
|
23
|
+
|
24
|
+
AdminData.config do |config|
|
25
|
+
config.find_conditions = ...
|
26
|
+
end
|
27
|
+
|
28
|
+
Please refer to documentation at
|
29
|
+
https://github.com/neerajdotname/admin_data/wiki/Customizing-admin_data-for-a-Rails-3-application
|
30
|
+
for more information.
|
31
|
+
|
32
|
+
EOF
|
33
|
+
|
34
|
+
raise msg
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module AdminData
|
2
|
+
|
3
|
+
class Configuration
|
4
|
+
|
5
|
+
# Number of recores displayed while listing records
|
6
|
+
attr_accessor :number_of_records_per_page
|
7
|
+
|
8
|
+
# Default value is false .
|
9
|
+
# Set this value to true if you want admin_data to ignored
|
10
|
+
# the column_limit returned by ActiveRecord .
|
11
|
+
attr_accessor :ignore_column_limit
|
12
|
+
|
13
|
+
# By default this value is true .
|
14
|
+
# Set this value to false if you do not want all the belongs_to
|
15
|
+
# ids to be populated. If set to false then instead of a dropdown
|
16
|
+
# user will get a text field where the id can be entered. It matters
|
17
|
+
# only while editing or creating a new record.
|
18
|
+
attr_accessor :drop_down_for_associations
|
19
|
+
|
20
|
+
# Holds a proc which should be called. If the returned value is
|
21
|
+
# true then user is granted the access. Otherwise access is denied.
|
22
|
+
attr_writer :is_allowed_to_view
|
23
|
+
|
24
|
+
# Holds a proc which should be called. If the returned value is
|
25
|
+
# true then user is granted the access. Otherwise access is denied.
|
26
|
+
attr_writer :is_allowed_to_update
|
27
|
+
|
28
|
+
# Holds a proc which should be called. If the returned value is
|
29
|
+
# true then user is granted the access. Otherwise access is denied.
|
30
|
+
attr_writer :is_allowed_to_view_feed
|
31
|
+
|
32
|
+
# For feed authentication a combination of user_id and password is used.
|
33
|
+
# This attribute sets the user_id .
|
34
|
+
attr_accessor :feed_authentication_user_id
|
35
|
+
|
36
|
+
# For feed authentication a combination of user_id and password is used.
|
37
|
+
# This attribute sets the password .
|
38
|
+
attr_accessor :feed_authentication_password
|
39
|
+
|
40
|
+
# Tell AdminData to not to use id for models like given below.
|
41
|
+
#
|
42
|
+
# class City < ActiveRecord::Base
|
43
|
+
# def to_param
|
44
|
+
# self.permanent_name
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# AdminData.config do |config|
|
49
|
+
# proc = lambda {|params| {:conditions => ["permanent_name = ?", params[:id] ] } }
|
50
|
+
# config.find_conditions = {'City' => proc }
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
attr_accessor :find_conditions
|
54
|
+
|
55
|
+
# Tell AdminData how to display the value for a column
|
56
|
+
#
|
57
|
+
# AdminData.config do |config|
|
58
|
+
# proc = lambda {|model| model.send(:data).inspect}
|
59
|
+
# config.column_settings = {'City' => {:data => proc } }
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
attr_accessor :column_settings
|
63
|
+
|
64
|
+
# Tell AdminData how to order the columns for a model.
|
65
|
+
#
|
66
|
+
# AdminData.config do |config|
|
67
|
+
# config.column_order = {'City' => [:id, :title, :body, :published_at, :author_name]}
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
attr_accessor :columns_order
|
71
|
+
|
72
|
+
def is_allowed_to_view
|
73
|
+
return lambda {|controller| return true } if Rails.env.development?
|
74
|
+
@is_allowed_to_view || lambda {|_| nil }
|
75
|
+
end
|
76
|
+
|
77
|
+
def is_allowed_to_update
|
78
|
+
return lambda {|controller| return true } if Rails.env.development?
|
79
|
+
@is_allowed_to_update || lambda {|_| nil }
|
80
|
+
end
|
81
|
+
|
82
|
+
def is_allowed_to_view_feed
|
83
|
+
return lambda {|controller| return true } if Rails.env.development?
|
84
|
+
@is_allowed_to_view_feed || lambda {|_| nil }
|
85
|
+
end
|
86
|
+
|
87
|
+
# TODO explain why it is needed
|
88
|
+
attr_reader :adapter_name
|
89
|
+
|
90
|
+
# Tell AdminData how to name a column in a listing
|
91
|
+
# Example:
|
92
|
+
#
|
93
|
+
# config.column_headers = {'Timesheet' => {:id => 'ID'}
|
94
|
+
#
|
95
|
+
attr_accessor :column_headers
|
96
|
+
|
97
|
+
def initialize
|
98
|
+
@number_of_records_per_page = 50
|
99
|
+
@is_allowed_to_view = nil
|
100
|
+
@is_allowed_to_update = nil
|
101
|
+
@is_allowed_to_view_feed = nil
|
102
|
+
@find_conditions = {}
|
103
|
+
@drop_down_for_associations = true
|
104
|
+
@columns_order = {}
|
105
|
+
@column_headers = {}
|
106
|
+
@column_settings = {}
|
107
|
+
@adapter_name = ActiveRecord::Base.connection.adapter_name
|
108
|
+
@ignore_column_limit = false
|
109
|
+
end
|
110
|
+
|
111
|
+
def display_assoc?( class_name )
|
112
|
+
case @drop_down_for_associations
|
113
|
+
when Hash
|
114
|
+
return @drop_down_for_associations[ class_name ]
|
115
|
+
when TrueClass, FalseClass
|
116
|
+
return @drop_down_for_associations
|
117
|
+
when NilClass
|
118
|
+
return false
|
119
|
+
else
|
120
|
+
raise "Configuration Error. #{@drop_down_for_associations} " \
|
121
|
+
"must be true, false or a Hash."
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module AdminData
|
4
|
+
class DateUtil
|
5
|
+
|
6
|
+
# returns a time object for the given input.
|
7
|
+
# validation is not done. It is assumed that client
|
8
|
+
# has done validation using .valid? method.
|
9
|
+
def self.valid?(input)
|
10
|
+
!!parse(input)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Usage:
|
14
|
+
#
|
15
|
+
# parase('13-feb-2008') # => time object
|
16
|
+
# parse('13-February-2008') # => time object
|
17
|
+
# parse('13-February-2008') # => time object
|
18
|
+
# parse('99-Feb-2008') #=> false
|
19
|
+
#
|
20
|
+
def self.parse(input)
|
21
|
+
return false if input.blank?
|
22
|
+
|
23
|
+
input.strip!
|
24
|
+
|
25
|
+
# remove all the white space characters
|
26
|
+
input.gsub!(/\s/,'')
|
27
|
+
|
28
|
+
return false if input.length < 9
|
29
|
+
|
30
|
+
dd,mm,yyyy = input.split('-')
|
31
|
+
return false if dd.nil? || mm.nil? || yyyy.nil?
|
32
|
+
|
33
|
+
# month must be of atleast three characters
|
34
|
+
return false if mm.length < 3
|
35
|
+
|
36
|
+
mm = mm.downcase[0,3]
|
37
|
+
|
38
|
+
months = {'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4, 'may' => 5, 'jun' => 6,
|
39
|
+
'jul' => 7, 'aug' => 8, 'sep' => 9, 'oct' => 10, 'nov' => 11, 'dec' => 12 }
|
40
|
+
|
41
|
+
return false unless months.keys.include? mm
|
42
|
+
|
43
|
+
mm = months[mm].to_i
|
44
|
+
yyyy = yyyy.to_i
|
45
|
+
dd = dd.to_i
|
46
|
+
|
47
|
+
# validate date values
|
48
|
+
begin
|
49
|
+
Date.new(yyyy,mm,dd)
|
50
|
+
rescue
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
|
54
|
+
Time.now.change(:year => yyyy, :month => mm, :day => dd, :hour => 0)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module AdminData
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace AdminData
|
4
|
+
|
5
|
+
initializer "admin_data precompile hook" do |app|
|
6
|
+
app.config.assets.precompile += [
|
7
|
+
'advance_search/*',
|
8
|
+
'analytics/*',
|
9
|
+
'misc/*',
|
10
|
+
'vendor/*',
|
11
|
+
'vendor/jquery-ui-1.7.2.custom.css',
|
12
|
+
'admin_data.js',
|
13
|
+
'admin_data.css'
|
14
|
+
]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module AdminData
|
2
|
+
module ModelFinder
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def models
|
6
|
+
ActiveRecord::Base.send(:subclasses).map do | klass |
|
7
|
+
namespaced_models(klass).push(klass.name)
|
8
|
+
end.flatten.sort
|
9
|
+
end
|
10
|
+
|
11
|
+
def namespaced_models(model_klass)
|
12
|
+
model_klass.subclasses.map(&:name)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|