cuca 0.01
Sign up to get free protection for your applications and to get access to all the features.
- data/application_skeleton/README +21 -0
- data/application_skeleton/app/_controllers/application.rb +7 -0
- data/application_skeleton/app/_layouts/simple.rb +19 -0
- data/application_skeleton/app/_widgets/sourcecode.rb +21 -0
- data/application_skeleton/app/_widgets/test.rb +23 -0
- data/application_skeleton/app/demo.rb +64 -0
- data/application_skeleton/app/index.rb +39 -0
- data/application_skeleton/app/user/__default_username/index.rb +7 -0
- data/application_skeleton/conf/environment.rb +16 -0
- data/application_skeleton/log/access.log +1 -0
- data/application_skeleton/log/error.log +1 -0
- data/application_skeleton/log/messages +1 -0
- data/application_skeleton/public/css/style.css +27 -0
- data/application_skeleton/public/dispatch.cgi +31 -0
- data/application_skeleton/public/dispatch.fcgi +36 -0
- data/application_skeleton/public/img/cuca-seagull.png +0 -0
- data/application_skeleton/scripts/console +5 -0
- data/application_skeleton/scripts/console.rb +5 -0
- data/application_skeleton/scripts/server-lighttpd-fcgi.rb +116 -0
- data/application_skeleton/scripts/server-lighttpd.rb +109 -0
- data/application_skeleton/scripts/server-webrick.rb +26 -0
- data/application_skeleton/scripts/test.rb +8 -0
- data/application_skeleton/tests/widgets/link.rb +22 -0
- data/bin/cuca +43 -0
- data/lib/cuca/app.rb +317 -0
- data/lib/cuca/cgi_emu.rb +67 -0
- data/lib/cuca/cgi_fix.rb +58 -0
- data/lib/cuca/const.rb +3 -0
- data/lib/cuca/controller.rb +240 -0
- data/lib/cuca/generator/markaby.rb +80 -0
- data/lib/cuca/generator/view.rb +121 -0
- data/lib/cuca/layout.rb +62 -0
- data/lib/cuca/mimetypes.rb +89 -0
- data/lib/cuca/session.rb +143 -0
- data/lib/cuca/sessionflash.rb +56 -0
- data/lib/cuca/sessionpage.rb +41 -0
- data/lib/cuca/stdlib/arform.rb +208 -0
- data/lib/cuca/stdlib/arview.rb +16 -0
- data/lib/cuca/stdlib/form.rb +137 -0
- data/lib/cuca/stdlib/formerrors.rb +20 -0
- data/lib/cuca/stdlib/link.rb +37 -0
- data/lib/cuca/stdlib/list.rb +3 -0
- data/lib/cuca/stdlib/listwidget/dblist.rb +122 -0
- data/lib/cuca/stdlib/listwidget/list.rb +189 -0
- data/lib/cuca/stdlib/listwidget/querydef.rb +167 -0
- data/lib/cuca/stdlib/listwidget/staticdatalist.rb +79 -0
- data/lib/cuca/stdlib/slink.rb +30 -0
- data/lib/cuca/test/helpers.rb +42 -0
- data/lib/cuca/urlmap.rb +267 -0
- data/lib/cuca/widget.rb +212 -0
- data/lib/cuca.rb +68 -0
- metadata +141 -0
@@ -0,0 +1,208 @@
|
|
1
|
+
module Cuca::Stdlib
|
2
|
+
|
3
|
+
require 'form'
|
4
|
+
require 'cuca/generator/markaby'
|
5
|
+
|
6
|
+
# == Form's for ActiveRecord
|
7
|
+
# AR Form can work just by providing one model of ActiveRecord.
|
8
|
+
# Likly that you want to overwrite the form method to
|
9
|
+
# run a custom layout. You can use the fe* methods to
|
10
|
+
# build form elements for the model columns
|
11
|
+
#
|
12
|
+
# = Example:
|
13
|
+
#
|
14
|
+
# ARForm('user_edit', User.find_by_username('bones'),
|
15
|
+
# :disable_on_update => ['username', 'created'])
|
16
|
+
#
|
17
|
+
class ARFormWidget < FormWidget
|
18
|
+
|
19
|
+
include Cuca::Generator::Markaby
|
20
|
+
|
21
|
+
# valid options
|
22
|
+
# * :disabled_on_create => ['field_name_1', 'field_name_2', ..]
|
23
|
+
# switch off fields on new records
|
24
|
+
# * :diabled_on_update => ['field_name_1', 'field_name_2', ..]
|
25
|
+
# switch off fields on existing records
|
26
|
+
def output(form_name, model, options = {})
|
27
|
+
@model = model
|
28
|
+
@disabled_on_update = options[:disabled_on_update] || []
|
29
|
+
@disabled_on_create = options[:disabled_on_create] || []
|
30
|
+
@hidden_on_update = options[:hidden_on_update] || []
|
31
|
+
@hidden_on_create = options[:hidden_on_create] || []
|
32
|
+
super(form_name, options[:post_to])
|
33
|
+
end
|
34
|
+
|
35
|
+
def on_submit
|
36
|
+
controller.send(@form_name+'_submit', @model) unless controller.nil?
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate
|
40
|
+
form if @_content.empty? # password fields might write hints to the validator...
|
41
|
+
@form_erros = {}
|
42
|
+
p = request_parameters.dup
|
43
|
+
p.delete(@submit_name)
|
44
|
+
|
45
|
+
# don't save empty passwords!!
|
46
|
+
$stderr.puts "Before validate: #{@password_fields.inspect}"
|
47
|
+
@password_fields ||= []
|
48
|
+
@password_fields.each do |pwf|
|
49
|
+
$stderr.puts "PWS: #{pwf} - #{p[pwf]}"
|
50
|
+
p.delete(pwf) if p[pwf].chomp.empty?
|
51
|
+
$stderr.puts "PWS: #{p.inspect}"
|
52
|
+
end
|
53
|
+
|
54
|
+
$stderr.puts "ARFORM Validate #{p.inspect}"
|
55
|
+
@model.attributes = p
|
56
|
+
|
57
|
+
return true if @model.valid?
|
58
|
+
|
59
|
+
@model.errors.each do |k,v|
|
60
|
+
@form_errors[k] = v
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# to make a 2 digit string out a number
|
65
|
+
private
|
66
|
+
def twodig(n)
|
67
|
+
n.to_s.length == 1 ? "0"+n.to_s : n.to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
def field_enable?(fname)
|
71
|
+
if @model.new_record? then
|
72
|
+
return @disabled_on_create.include?(fname) ? false : true
|
73
|
+
else
|
74
|
+
return @disabled_on_update.include?(fname) ? false : true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
def field_hidden?(fname)
|
78
|
+
if @model.new_record? then
|
79
|
+
return @hidden_on_create.include?(fname) ? true : false
|
80
|
+
else
|
81
|
+
return @hidden_on_update.include?(fname) ? true : false
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
private
|
87
|
+
def fe_text(name, value,enabled)
|
88
|
+
"<input type='text' name='#{name}' value='#{value}' #{'disabled' unless enabled}>"
|
89
|
+
end
|
90
|
+
|
91
|
+
# the fe-password is special: will never contain a value and will not save the
|
92
|
+
# password if nothing was typed into the field
|
93
|
+
private
|
94
|
+
def fe_password(name,enabled)
|
95
|
+
@password_fields ||= []
|
96
|
+
@password_fields << name
|
97
|
+
r = "<input type='password' name='#{name}' #{'disabled' unless enabled}>"
|
98
|
+
if !@model.new_record? then
|
99
|
+
r << "<br><small>Leave empty to keep current password</small>"
|
100
|
+
end
|
101
|
+
return r
|
102
|
+
end
|
103
|
+
|
104
|
+
# this is to build a select box, example:
|
105
|
+
# fe_select('gender', [['f', 'female'],['m','Male']], true) or
|
106
|
+
# fe_select('gender', ['f','m'], true)
|
107
|
+
private
|
108
|
+
def fe_select(name, options, enabled)
|
109
|
+
r = "<select name='#{name}' #{'disabled' unless enabled}>\n"
|
110
|
+
options.each do |o|
|
111
|
+
ov = o.instance_of?(Array) ? o[0] : o
|
112
|
+
sel = ''
|
113
|
+
sel = ' selected' if @model.send(name.intern) == ov
|
114
|
+
if o.instance_of?(Array) then
|
115
|
+
r+="<option value='#{o[0]}'#{sel}>#{o[1]}</option>\n"
|
116
|
+
else
|
117
|
+
r+="<option value='#{o}'#{sel}>#{o}</option>\n"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
r+="</option>\n"
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
def fe_datetime(name, v,enabled)
|
125
|
+
v = Time.now unless v
|
126
|
+
r = <<-EOS
|
127
|
+
<input type='text' name='#{name}' id='i_#{name}' value='#{v.year}/#{twodig(v.month)}/#{twodig(v.day)} #{v.hour}:#{v.min}' #{'disabled' unless enabled}>
|
128
|
+
EOS
|
129
|
+
if enabled then
|
130
|
+
r << <<-EOS
|
131
|
+
<input type='submit' id='s_#{name}' value='...'>
|
132
|
+
<script type="text/javascript">
|
133
|
+
Calendar.setup({
|
134
|
+
inputField : "i_#{name}", // id of the input field
|
135
|
+
ifFormat : "%Y/%m/%d %H:%M", // format of the input field
|
136
|
+
showsTime : true, // will display a time selector
|
137
|
+
button : "s_#{name}", // trigger for the calendar (button ID)
|
138
|
+
singleClick : true, // double-click mode
|
139
|
+
step : 1 // show all years in drop-down boxes (instead of every other year as default)
|
140
|
+
});
|
141
|
+
</script>
|
142
|
+
</input>
|
143
|
+
EOS
|
144
|
+
end
|
145
|
+
return r
|
146
|
+
end
|
147
|
+
|
148
|
+
def fe_bool(name,v,enabled)
|
149
|
+
r = ''
|
150
|
+
r << "<select name='#{name}' #{'disabled' unless enabled}>\n"
|
151
|
+
r << "<option #{"selected" if v} value='t'>true</option>\n"
|
152
|
+
r << "<option #{"selected" if !v} value='f'>false</option>\n"
|
153
|
+
r << "</select>\n"
|
154
|
+
end
|
155
|
+
|
156
|
+
def fe_int(name,v,enabled)
|
157
|
+
"<input type='text' name='#{name}' value='#{v}' #{'disabled' unless enabled} size=5>"
|
158
|
+
end
|
159
|
+
|
160
|
+
def fe(type, name, value='')
|
161
|
+
return '' if field_hidden?(name)
|
162
|
+
enabled = field_enable?(name)
|
163
|
+
r = ""
|
164
|
+
case(type)
|
165
|
+
when :string
|
166
|
+
r << fe_text(name,value,enabled)
|
167
|
+
when :boolean
|
168
|
+
r << fe_bool(name,value,enabled)
|
169
|
+
when :integer
|
170
|
+
r << fe_int(name,value,enabled)
|
171
|
+
when :datetime
|
172
|
+
r << fe_datetime(name,value,enabled)
|
173
|
+
when :password
|
174
|
+
r << fe_password(name, enabled)
|
175
|
+
end
|
176
|
+
return r
|
177
|
+
end
|
178
|
+
|
179
|
+
# build a form element for column name
|
180
|
+
def fe_for(column_name, hint='')
|
181
|
+
col = @model.column_for_attribute(column_name)
|
182
|
+
fe(col.type, col.name, @model.send(column_name.intern))
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
# you might want to replace this method
|
187
|
+
public
|
188
|
+
def form
|
189
|
+
r = mabtext { FormErrors(@form_errors) }
|
190
|
+
r << "<form action='#{@post_to}' method='POST'>\n"
|
191
|
+
r << "<table>"
|
192
|
+
@model.class.columns.each do |col|
|
193
|
+
k = col.name
|
194
|
+
v = @model.send(k.intern) # this allows us to overwrite accessors
|
195
|
+
r << "<tr><td>#{k}</td><td>#{fe(col.type,k,v)}</td></tr>"
|
196
|
+
end
|
197
|
+
r << "<tr><td><br/></td></tr>"
|
198
|
+
r << "<tr><td></td><td><input type='submit' value=#{@model.new_record? ? 'Save' : 'Update'} name='#{@submit_name}'></td></tr>"
|
199
|
+
r << "</table>\n</form>\n"
|
200
|
+
@_content = r
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
|
207
|
+
|
208
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
# This is a small widget to display an ActiveRecord Record
|
3
|
+
class ARViewWidget < Cuca::Widget
|
4
|
+
|
5
|
+
def output(model, headline='')
|
6
|
+
@model = model
|
7
|
+
|
8
|
+
r = "<table>"
|
9
|
+
@model.class.columns.each do |col|
|
10
|
+
r << "<tr><td>#{col.name}</td><td>#{@model.send(col.name.intern)}</td></tr>"
|
11
|
+
end
|
12
|
+
r << "</table>"
|
13
|
+
@_content = r
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
#
|
2
|
+
# == Cuca Standard Widget Library
|
3
|
+
# This namespace should contain a standard widget library.
|
4
|
+
#
|
5
|
+
# <b>Warning: The widgets you find here are fairly untested and might not work!!</b>
|
6
|
+
# Any request and patches - Welcome
|
7
|
+
# module Cuca::Stdlib
|
8
|
+
|
9
|
+
# == FormWidget
|
10
|
+
#
|
11
|
+
# To implement a form inherit this class and overwrite:
|
12
|
+
#
|
13
|
+
# * form - generate your form (as if it was the output method of a widget)
|
14
|
+
# - Use @form_name for your html form name
|
15
|
+
# - Use @submit_name for your submit button
|
16
|
+
# * validate - to validate a posted form
|
17
|
+
# - write @form_errors['element_name'] on errors (to handle them with FormErrors Widget)
|
18
|
+
# * setup - Define initial values for your form
|
19
|
+
#
|
20
|
+
# A form will call {form_name}_submit(result) on the CONTROLLER if the form was submitted
|
21
|
+
# and validation passed.
|
22
|
+
# If you don't want this, overwrite on_submit
|
23
|
+
#
|
24
|
+
# A form will use instance variables for form values
|
25
|
+
class FormWidget < Cuca::Widget
|
26
|
+
|
27
|
+
def posted?
|
28
|
+
return (request_method == 'POST' && !params[@submit_name].nil?)
|
29
|
+
end
|
30
|
+
|
31
|
+
# get from params and set instance variables
|
32
|
+
def load_variables
|
33
|
+
$stderr.puts "\n\nLoad Variables: #{$cgi.params.inspect}\n\n"
|
34
|
+
params.each_pair { |k,v| instance_variable_set('@'+k, v) ; $stderr.puts "Form: Setting #{k} - #{v}" }
|
35
|
+
end
|
36
|
+
|
37
|
+
# get from params and return them as hash
|
38
|
+
def get_variables
|
39
|
+
r = {}
|
40
|
+
params.each_pair { |k,v| r[k] = v }
|
41
|
+
return r
|
42
|
+
end
|
43
|
+
|
44
|
+
# Overwrite this method to setup initial values
|
45
|
+
# This method will not be called if the form get submitted.
|
46
|
+
def setup
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
# Create your form by overwriting this demo
|
51
|
+
# Name your submit button @submit_name, so the form can detect if it
|
52
|
+
# is submitted or not.
|
53
|
+
def form
|
54
|
+
end
|
55
|
+
|
56
|
+
# Overwrite this method with your validation code
|
57
|
+
# @form_errors hash with error messages
|
58
|
+
def validate
|
59
|
+
end
|
60
|
+
|
61
|
+
# If form is validated we call on_submit. Default behaviour is to call
|
62
|
+
# {form_name}_submit(result) on the CONTROLLER.
|
63
|
+
def on_submit
|
64
|
+
controller.send(@form_name+'_submit', get_variables) unless controller.nil?
|
65
|
+
end
|
66
|
+
|
67
|
+
def output(form_name, post_to = nil)
|
68
|
+
@form_name = form_name
|
69
|
+
@post_to = post_to || cgi.path_info
|
70
|
+
@submit_name = 'submit_'+@form_name
|
71
|
+
@form_errors = {}
|
72
|
+
|
73
|
+
if posted? then
|
74
|
+
load_variables
|
75
|
+
validate
|
76
|
+
if @form_errors.empty? then
|
77
|
+
clear # submitted forms should not have any content that might have been generated
|
78
|
+
return on_submit
|
79
|
+
else
|
80
|
+
form
|
81
|
+
end
|
82
|
+
else
|
83
|
+
setup
|
84
|
+
form
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
require 'cuca/generator/markaby'
|
92
|
+
|
93
|
+
class TestFormWidget < FormWidget
|
94
|
+
|
95
|
+
include Cuca::Generator::Markaby
|
96
|
+
|
97
|
+
def setup
|
98
|
+
@demo_input = "enter something"
|
99
|
+
end
|
100
|
+
|
101
|
+
def make_tips
|
102
|
+
@form_errors.each_pair do |k,v|
|
103
|
+
hints[:tips] ||= []
|
104
|
+
hints[:tips] << { :id => k, :title => "Error in form", :text => v}
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
def validate
|
110
|
+
# validate form return true/false
|
111
|
+
if @demo_input != 'demo' then
|
112
|
+
@form_errors['demo_input'] = "I said please enter 'demo' but you entered #{@demo_input}"
|
113
|
+
end
|
114
|
+
make_tips
|
115
|
+
true
|
116
|
+
end
|
117
|
+
|
118
|
+
def form
|
119
|
+
mab {
|
120
|
+
|
121
|
+
FormErrors(@form_errors)
|
122
|
+
|
123
|
+
form( :action=>@post_to, :method=>'post') { # :name=>@form_name,
|
124
|
+
text "This is a demo form, overwrite 'form' method. Enter 'demo'"
|
125
|
+
br
|
126
|
+
E('demo_input', true) { input(:type => 'text', :value => @demo_input, :name=>'demo_input'); text @error_text }
|
127
|
+
br
|
128
|
+
br
|
129
|
+
input(:type => 'submit', :value => 'save', :name => @submit_name)
|
130
|
+
}
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
# end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'cuca/generator/markaby'
|
2
|
+
|
3
|
+
# this widget you can use within a form to display all form errors
|
4
|
+
class FormErrorsWidget < Cuca::Widget
|
5
|
+
|
6
|
+
include Cuca::Generator::Markaby
|
7
|
+
|
8
|
+
def output(form_errors, title = nil)
|
9
|
+
return if form_errors.empty?
|
10
|
+
mab {
|
11
|
+
b title ? title : "Form contains errors"
|
12
|
+
ul {
|
13
|
+
form_errors.each_pair { |name, value|
|
14
|
+
li { b {name}; text " - #{value}" }
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'cuca/generator/markaby'
|
2
|
+
|
3
|
+
|
4
|
+
# A markaby link - Please use with care!! it's slow! Better to use SLinkWidget.
|
5
|
+
class LinkWidget < Cuca::Widget
|
6
|
+
|
7
|
+
include Cuca::Generator::Markaby
|
8
|
+
|
9
|
+
private
|
10
|
+
def build_href(target, params)
|
11
|
+
r = target
|
12
|
+
|
13
|
+
r=r+"?" unless params.empty?
|
14
|
+
|
15
|
+
params.each_key do |key|
|
16
|
+
r = r + '&' unless r[r.size-1].chr == '?'
|
17
|
+
r = "#{r}#{key}=#{params[key]}"
|
18
|
+
end
|
19
|
+
return r
|
20
|
+
end
|
21
|
+
|
22
|
+
# public
|
23
|
+
# def output(target, params = {}, tag_attrib = {}, &block)
|
24
|
+
#
|
25
|
+
# end
|
26
|
+
|
27
|
+
|
28
|
+
public
|
29
|
+
def output(target, params = {}, tag_attrib = {}, &block)
|
30
|
+
@attribs = tag_attrib
|
31
|
+
@attribs[:href] = build_href(target, params)
|
32
|
+
@block = block
|
33
|
+
mab {
|
34
|
+
a(@attribs) { text capture(&block) }
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'cuca/stdlib/listwidget/list'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
# List with Active Record model as data source
|
5
|
+
#
|
6
|
+
# DBList('dblistname', User, :columns => [ { :id => 'id', :query => 'user.id', :display=>'ID' },
|
7
|
+
# { :id => 'name', :display=>'Name', :searchable=>false } ])
|
8
|
+
#
|
9
|
+
# Options:
|
10
|
+
# :joins => ActiveRecord find :joins options.
|
11
|
+
#
|
12
|
+
# :columns: Columns possible flags:
|
13
|
+
# :id => [required] name. Likly this is the database column name
|
14
|
+
# :query => [optional] how to query the id (eg: users.name) . If false then treated as virtual column
|
15
|
+
# :display => [optional] title for the column
|
16
|
+
# :searchable => [optional] true/false if this column can be searched (default autodetect)
|
17
|
+
# :sortable = => [optional] true/false if columns can be sorted (default autodetect)
|
18
|
+
# DBLIST specific is only :query
|
19
|
+
class DBListWidget < BaseList
|
20
|
+
def columns
|
21
|
+
# $stderr.puts " Getting Columns: #{@columns}"
|
22
|
+
@columns
|
23
|
+
end
|
24
|
+
|
25
|
+
# returns :query field by :id (only :id is defined in the QueryDef)
|
26
|
+
def wc_query_field(field_id)
|
27
|
+
@columns.each do |c|
|
28
|
+
if c[:id] == field_id then
|
29
|
+
return c[:query]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
field_id
|
33
|
+
end
|
34
|
+
|
35
|
+
def where_clause(query_def)
|
36
|
+
res = []
|
37
|
+
query_def.filters.each_pair do |k,v|
|
38
|
+
next if (v.nil? || v == '')
|
39
|
+
if @model_class.columns_hash.include?(k) && @model_class.columns_hash[k].number? then
|
40
|
+
res << "#{wc_query_field(k)} = #{v}"
|
41
|
+
else
|
42
|
+
res << "#{wc_query_field(k)} LIKE '%#{v}%'"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
wc = "true"
|
46
|
+
res.collect { |e| "(#{e})" }.each { |c| wc+=" AND #{c}" }
|
47
|
+
wc+= " AND #{@extra_conditions}" if @extra_conditions != ''
|
48
|
+
# $stderr.puts "WHERE clause is #{wc}"
|
49
|
+
return wc
|
50
|
+
end
|
51
|
+
|
52
|
+
# transform a active record result to an [[]]- array
|
53
|
+
def normalize_result(ar_res)
|
54
|
+
res = []
|
55
|
+
ar_res.each do |r|
|
56
|
+
c = []
|
57
|
+
columns.each do |col|
|
58
|
+
# fixme: this doesn't catch join table results!!!
|
59
|
+
if @model_class.column_methods_hash[col[:id].intern] then
|
60
|
+
c << r.send(col[:id].to_sym)
|
61
|
+
else
|
62
|
+
c << ''
|
63
|
+
end
|
64
|
+
end
|
65
|
+
res << c
|
66
|
+
end
|
67
|
+
res
|
68
|
+
end
|
69
|
+
|
70
|
+
def query(query_def)
|
71
|
+
findstuff = {:conditions => where_clause(query_def) }
|
72
|
+
findstuff[:order] = query_def.order_by unless (query_def.order_by.nil? || query_def.order_by == '')
|
73
|
+
findstuff[:offset] = query_def.range.first
|
74
|
+
findstuff[:limit] = query_def.range.last-query_def.range.first+1
|
75
|
+
findstuff[:joins] = @joins || nil
|
76
|
+
sel = @columns.collect do |c|
|
77
|
+
ret = c.has_key?(:query) ? "#{c[:query]} as #{c[:id]}" : c[:id]
|
78
|
+
ret = nil if c[:query] == false
|
79
|
+
ret
|
80
|
+
end
|
81
|
+
findstuff[:select] = sel.compact.join(',')
|
82
|
+
# $stderr.puts "Find-Stuff: #{findstuff.inspect}"
|
83
|
+
@data = @model_class.find(:all, findstuff)
|
84
|
+
@data = normalize_result(@data)
|
85
|
+
@total_rows= @model_class.count(:conditions => where_clause(query_def), :joins => @joins)
|
86
|
+
# $stderr.puts "Query: #{@data.inspect} - #{query_def.order_by.inspect}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def setup
|
90
|
+
super
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# this will fix/add searchable/sortable and query flag
|
95
|
+
def fixup_columns
|
96
|
+
@columns.each_index do |idx|
|
97
|
+
|
98
|
+
if @columns[idx][:searchable].nil? then
|
99
|
+
@columns[idx][:searchable] = @model_class.column_methods_hash[@columns[idx][:id].intern] ? true : false
|
100
|
+
end
|
101
|
+
@columns[idx][:query] = @columns[idx][:id] if @columns[idx][:query].nil?
|
102
|
+
|
103
|
+
if @columns[idx][:sortable].nil? then
|
104
|
+
@columns[idx][:sortable] = @columns[idx][:query] == false ? false : true
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def output(list_name, model_class = nil, data_setup = {})
|
111
|
+
@columns = data_setup[:columns] || []
|
112
|
+
@extra_conditions = data_setup[:conditons] || ""
|
113
|
+
@joins = data_setup[:joins] || ""
|
114
|
+
@model_class = model_class || nil
|
115
|
+
setup
|
116
|
+
fixup_columns
|
117
|
+
# $stderr.puts @columns.inspect
|
118
|
+
@columns.freeze
|
119
|
+
@extra_conditions.freeze
|
120
|
+
super(list_name)
|
121
|
+
end
|
122
|
+
end
|