bureaucrat 0.0.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +120 -105
- data/Rakefile +9 -0
- data/bureaucrat.gemspec +32 -0
- data/lib/bureaucrat.rb +26 -8
- data/lib/bureaucrat/fields.rb +572 -336
- data/lib/bureaucrat/forms.rb +296 -257
- data/lib/bureaucrat/formsets.rb +235 -194
- data/lib/bureaucrat/quickfields.rb +90 -62
- data/lib/bureaucrat/temporary_uploaded_file.rb +14 -0
- data/lib/bureaucrat/utils.rb +79 -62
- data/lib/bureaucrat/validators.rb +163 -0
- data/lib/bureaucrat/widgets.rb +459 -303
- data/test/fields_test.rb +519 -380
- data/test/forms_test.rb +78 -58
- data/test/formsets_test.rb +48 -22
- data/test/test_helper.rb +20 -12
- data/test/widgets_test.rb +224 -204
- metadata +27 -36
- data/lib/bureaucrat/validation.rb +0 -130
- data/lib/bureaucrat/validation_old.rb +0 -148
- data/lib/bureaucrat/wizard.rb +0 -220
metadata
CHANGED
@@ -1,36 +1,30 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: bureaucrat
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.10.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Bruno Deferrari
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2009-11-03 00:00:00 -02:00
|
13
|
-
default_executable:
|
12
|
+
date: 2012-04-14 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
|
-
description:
|
14
|
+
description: Bureaucrat is a form handling library for Ruby.
|
17
15
|
email: utizoc@gmail.com
|
18
16
|
executables: []
|
19
|
-
|
20
17
|
extensions: []
|
21
|
-
|
22
18
|
extra_rdoc_files: []
|
23
|
-
|
24
|
-
files:
|
19
|
+
files:
|
25
20
|
- lib/bureaucrat/fields.rb
|
26
21
|
- lib/bureaucrat/forms.rb
|
27
22
|
- lib/bureaucrat/formsets.rb
|
28
23
|
- lib/bureaucrat/quickfields.rb
|
24
|
+
- lib/bureaucrat/temporary_uploaded_file.rb
|
29
25
|
- lib/bureaucrat/utils.rb
|
30
|
-
- lib/bureaucrat/
|
31
|
-
- lib/bureaucrat/validation_old.rb
|
26
|
+
- lib/bureaucrat/validators.rb
|
32
27
|
- lib/bureaucrat/widgets.rb
|
33
|
-
- lib/bureaucrat/wizard.rb
|
34
28
|
- lib/bureaucrat.rb
|
35
29
|
- README.md
|
36
30
|
- LICENSE
|
@@ -39,33 +33,30 @@ files:
|
|
39
33
|
- test/formsets_test.rb
|
40
34
|
- test/test_helper.rb
|
41
35
|
- test/widgets_test.rb
|
42
|
-
|
36
|
+
- Rakefile
|
37
|
+
- bureaucrat.gemspec
|
43
38
|
homepage: http://github.com/tizoc/bureaucrat
|
44
39
|
licenses: []
|
45
|
-
|
46
40
|
post_install_message:
|
47
41
|
rdoc_options: []
|
48
|
-
|
49
|
-
require_paths:
|
42
|
+
require_paths:
|
50
43
|
- lib
|
51
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
63
56
|
requirements: []
|
64
|
-
|
65
57
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.
|
58
|
+
rubygems_version: 1.8.11
|
67
59
|
signing_key:
|
68
|
-
specification_version:
|
60
|
+
specification_version: 3
|
69
61
|
summary: Form handling for Ruby inspired by Django forms.
|
70
62
|
test_files: []
|
71
|
-
|
@@ -1,130 +0,0 @@
|
|
1
|
-
require 'bureaucrat/utils'
|
2
|
-
|
3
|
-
module Bureaucrat
|
4
|
-
module Validation
|
5
|
-
|
6
|
-
class ValidationError < Exception
|
7
|
-
attr_reader :error_code, :parameters
|
8
|
-
|
9
|
-
def initialize(error_code, parameters=nil)
|
10
|
-
@error_code = error_code
|
11
|
-
@parameters = parameters || {}
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
module Validates
|
16
|
-
module_function
|
17
|
-
def fail_with(error_code, parameters=nil)
|
18
|
-
raise ValidationError.new(error_code, parameters)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
module Converters
|
23
|
-
include Validates
|
24
|
-
|
25
|
-
module_function
|
26
|
-
|
27
|
-
def to_integer(string)
|
28
|
-
Integer(string)
|
29
|
-
rescue ArgumentError
|
30
|
-
fail_with(:invalid)
|
31
|
-
end
|
32
|
-
|
33
|
-
def to_float(string)
|
34
|
-
Utils.make_float(string)
|
35
|
-
rescue ArgumentError
|
36
|
-
fail_with(:invalid)
|
37
|
-
end
|
38
|
-
|
39
|
-
def to_big_decimal(string)
|
40
|
-
Utils.make_float(string)
|
41
|
-
BigDecimal.new(string)
|
42
|
-
rescue ArgumentError
|
43
|
-
fail_with(:invalid)
|
44
|
-
end
|
45
|
-
|
46
|
-
def to_bool(string)
|
47
|
-
['false', '0'].include?(string) ? false : Utils.make_bool(string)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
module Validators
|
52
|
-
include Validates
|
53
|
-
|
54
|
-
module_function
|
55
|
-
|
56
|
-
def empty_value?(value)
|
57
|
-
value.nil? || value == ''
|
58
|
-
end
|
59
|
-
|
60
|
-
def is_present(value)
|
61
|
-
fail_with(:required) if empty_value?(value)
|
62
|
-
end
|
63
|
-
|
64
|
-
def not_empty(value)
|
65
|
-
fail_with(:required) if value.empty?
|
66
|
-
end
|
67
|
-
|
68
|
-
def is_true(value)
|
69
|
-
fail_with(:required) unless value
|
70
|
-
end
|
71
|
-
|
72
|
-
def is_array(value)
|
73
|
-
fail_with(:invalid_list) unless value.kind_of(Array)
|
74
|
-
end
|
75
|
-
|
76
|
-
def has_min_length(value, min_length)
|
77
|
-
value_length = value.length
|
78
|
-
fail_with(:min_length, :min => min_length,
|
79
|
-
:length => value_length) if value_length < min_length
|
80
|
-
end
|
81
|
-
|
82
|
-
def has_max_length(value, max_length)
|
83
|
-
value_length = value.length
|
84
|
-
fail_with(:max_length, :max => max_length,
|
85
|
-
:length => value_length) if value_length > max_length
|
86
|
-
end
|
87
|
-
|
88
|
-
def is_not_lesser_than(value, min_value)
|
89
|
-
fail_with(:min_value, :min => min_value) if value < min_value
|
90
|
-
end
|
91
|
-
|
92
|
-
def is_not_greater_than(value, max_value)
|
93
|
-
fail_with(:max_value, :max => max_value) if value > max_value
|
94
|
-
end
|
95
|
-
|
96
|
-
def has_max_digits(value, max_digits)
|
97
|
-
sign, alldigits, _, whole_digits = value.split
|
98
|
-
fail_with(:max_digits, :max => max_digits) if alldigits > max_digits
|
99
|
-
end
|
100
|
-
|
101
|
-
def has_max_decimal_places(values, decimal_places)
|
102
|
-
sign, alldigits, _, whole_digits = value.split
|
103
|
-
decimals = alldigits.length - whole_digits
|
104
|
-
fail_with(:max_decimal_places, :max => decimal_places) if
|
105
|
-
decimals > decimal_places
|
106
|
-
end
|
107
|
-
|
108
|
-
def has_max_whole_digits(value, max_digits)
|
109
|
-
sign, alldigits, _, whole_digits = value.split
|
110
|
-
fail_with(:max_digits, :max => max_digits) if alldigits > max_digits
|
111
|
-
end
|
112
|
-
|
113
|
-
def included_in(value, collection)
|
114
|
-
fail_with(:not_included, :collection => collection) unless
|
115
|
-
collection.include?(value)
|
116
|
-
end
|
117
|
-
|
118
|
-
def matches_regex(value, regex, error_code=:invalid)
|
119
|
-
fail_with(error_code, :regex => regex) if regex !~ value
|
120
|
-
end
|
121
|
-
|
122
|
-
EMAIL_RE = /(^[-!#\$%&'*+\/=?^_`{}|~0-9A-Z]+(\.[-!#\$%&'*+\/=?^_`{}|~0-9A-Z]+)*|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*")@(?:[A-Z0-9]+(?:-*[A-Z0-9]+)*\.)+[A-Z]{2,6}$/i
|
123
|
-
|
124
|
-
def is_email(value)
|
125
|
-
matches_regex(value, EMAIL_RE)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
end
|
130
|
-
end
|
@@ -1,148 +0,0 @@
|
|
1
|
-
module ValueValidator
|
2
|
-
def initialize_vv(format_validator, adaptor, value_validator)
|
3
|
-
@vv_format_validator = format_validator
|
4
|
-
@vv_adaptor = adaptor
|
5
|
-
@vv_value_validator = value_validator
|
6
|
-
end
|
7
|
-
|
8
|
-
# add_format_validator
|
9
|
-
# add_value_validator
|
10
|
-
|
11
|
-
def clean(value, all_values={}, object=nil)
|
12
|
-
return if @vv_format_validator.validate(value, all_values, object)
|
13
|
-
@vv_value_validator.validate(@vv_adaptor.call(value), all_values, object)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
module Adaptors
|
18
|
-
class Adaptor
|
19
|
-
include Validates
|
20
|
-
|
21
|
-
def initialize(allow_blank=false)
|
22
|
-
@allow_blank = allow_blank
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_object(value)
|
26
|
-
if blank?(value)
|
27
|
-
fail_with(:blank) unless @allow_blank
|
28
|
-
nil
|
29
|
-
else
|
30
|
-
adapt(value)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def adapt(value)
|
35
|
-
value
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class IntegerAdaptor < Adaptor
|
40
|
-
def adapt(value)
|
41
|
-
begin
|
42
|
-
Integer(value)
|
43
|
-
rescue ArgumentError
|
44
|
-
fail_with(:not_integer)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class FloatAdaptor < Adaptor
|
50
|
-
include Bureaucrat::Utils
|
51
|
-
|
52
|
-
def adapt(value)
|
53
|
-
begin
|
54
|
-
make_float(value)
|
55
|
-
rescue ArgumentError
|
56
|
-
fail_with(:not_float)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
class Validator
|
64
|
-
include Validates
|
65
|
-
|
66
|
-
def initialize(allow_blank=false)
|
67
|
-
@allow_blank = allow_blank
|
68
|
-
end
|
69
|
-
|
70
|
-
def valid?(value, all_values={}, object=nil)
|
71
|
-
validate(value, all_values, object)
|
72
|
-
true
|
73
|
-
end
|
74
|
-
|
75
|
-
def validate(value, all_values={}, object=nil)
|
76
|
-
blank?(value) && @allow_blank
|
77
|
-
end
|
78
|
-
|
79
|
-
def blank?(value)
|
80
|
-
value.nil? || value.empty?
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
class HasMinimumLengthOf < Validator
|
85
|
-
def initialize(min_length)
|
86
|
-
@min_length = min_length
|
87
|
-
end
|
88
|
-
|
89
|
-
def validate(value, all_values={}, object=nil)
|
90
|
-
value_length = value.length
|
91
|
-
fail_with(:min_length,
|
92
|
-
:min_length => @min_length,
|
93
|
-
:value_length => value_length) if value_length < @min_length
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
class HasMaximumLengthOf < Validator
|
98
|
-
def initialize(max_length)
|
99
|
-
@max_length = max_length
|
100
|
-
end
|
101
|
-
|
102
|
-
def validate(value, all_values={}, object=nil)
|
103
|
-
value_length = value.length
|
104
|
-
fail_with(:max_length,
|
105
|
-
:max_length => @max_length,
|
106
|
-
:value_length => value_length) if value_length < @max_length
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
class IsEqualOrGreaterThan < Validator
|
111
|
-
def initialize(min_value)
|
112
|
-
@min_value = min_value
|
113
|
-
end
|
114
|
-
|
115
|
-
def validate(value, all_values={}, object=nil)
|
116
|
-
fail_with(:less_than, :min_value => @min_value) if value < @min_value
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
class IsEqualOrLessThan < Validator
|
121
|
-
def initialize(max_value)
|
122
|
-
@max_value = max_value
|
123
|
-
end
|
124
|
-
|
125
|
-
def validate(value, all_values={}, object=nil)
|
126
|
-
fail_with(:more_than, :max_value => @max_value) if value > @max_value
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
class MatchesRegex < Validator
|
131
|
-
def initialize(regex, custom_error_code=nil)
|
132
|
-
@regex = regex
|
133
|
-
@custom_error_code = custom_error_code
|
134
|
-
end
|
135
|
-
|
136
|
-
def validate(value, all_values={}, object=nil)
|
137
|
-
fail_with(@custom_error_code || :not_matching_regex,
|
138
|
-
:regex => @regex) if @regex !~ value
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
class IsEmail < MatchesRegex
|
143
|
-
EMAIL_RE = /(^[-!#\$%&'*+\/=?^_`{}|~0-9A-Z]+(\.[-!#\$%&'*+\/=?^_`{}|~0-9A-Z]+)*|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*")@(?:[A-Z0-9]+(?:-*[A-Z0-9]+)*\.)+[A-Z]{2,6}$/i
|
144
|
-
|
145
|
-
def initialize
|
146
|
-
super(EMAIL_RE, :is_not_email)
|
147
|
-
end
|
148
|
-
end
|
data/lib/bureaucrat/wizard.rb
DELETED
@@ -1,220 +0,0 @@
|
|
1
|
-
require 'digest'
|
2
|
-
|
3
|
-
require 'bureaucrat/forms'
|
4
|
-
# import cPickle as pickle
|
5
|
-
|
6
|
-
# from django.conf import settings
|
7
|
-
# from django.http import Http404
|
8
|
-
# from django.shortcuts import render_to_response
|
9
|
-
# from django.template.context import RequestContext
|
10
|
-
# from django.utils.hashcompat import md5_constructor
|
11
|
-
# from django.utils.translation import ugettext_lazy as _
|
12
|
-
|
13
|
-
module Bureaucrat; Wizard
|
14
|
-
module Utils
|
15
|
-
def security_hash(request, form, *args)
|
16
|
-
data = []
|
17
|
-
form.each do |bf|
|
18
|
-
value = if form.empty_permitted? && ! form.changed? then bf.data
|
19
|
-
else bf.field.clean(bf.data)
|
20
|
-
end
|
21
|
-
value ||= ''
|
22
|
-
value = value.strip if value.respond_to? :strip
|
23
|
-
data.append([bf.name, value])
|
24
|
-
end
|
25
|
-
|
26
|
-
data += args
|
27
|
-
data << settings.SECRET_KEY # FIXME
|
28
|
-
|
29
|
-
Digest::MD5.hexdigest(Marshal.dump(data))
|
30
|
-
end
|
31
|
-
|
32
|
-
module_function :security_hash
|
33
|
-
end
|
34
|
-
|
35
|
-
class FormWizard
|
36
|
-
# FIXME
|
37
|
-
# The HTML (and POST data) field name for the "step" variable.
|
38
|
-
|
39
|
-
class << self
|
40
|
-
attr_accessor :step_field_name
|
41
|
-
end
|
42
|
-
|
43
|
-
self.step_field_name = "wizard_step"
|
44
|
-
|
45
|
-
def initialize(form_list, initial=Hash.new)
|
46
|
-
@form_list = form_list.dup
|
47
|
-
@initial = initial
|
48
|
-
@step = 0
|
49
|
-
end
|
50
|
-
|
51
|
-
def get_form(step, data=nil)
|
52
|
-
@form_list[step].new(data,
|
53
|
-
:prefix => prefix_for_step(step),
|
54
|
-
:initial => @initial.fetch(step, nil))
|
55
|
-
end
|
56
|
-
|
57
|
-
def num_steps
|
58
|
-
@form_list.length
|
59
|
-
end
|
60
|
-
|
61
|
-
def new(request, *args)
|
62
|
-
current_step = determine_step(request, *args)
|
63
|
-
parse_params(request, *args)
|
64
|
-
|
65
|
-
raise ArgumentError("Step #{current_step} does not exist") if
|
66
|
-
current_step >= num_steps
|
67
|
-
|
68
|
-
(0...current_step).each do |i|
|
69
|
-
form = get_form(i, request.POST)
|
70
|
-
|
71
|
-
return render_hash_failure(request, i) if
|
72
|
-
request.POST.fetch("hash_#{i}", '') != security_hash(request, form)
|
73
|
-
|
74
|
-
process_step(request, form, i)
|
75
|
-
end
|
76
|
-
|
77
|
-
form = get_form(current_step, request.post? ? request.POST : nil)
|
78
|
-
|
79
|
-
if form.valid?
|
80
|
-
process_step(request, form, current_step)
|
81
|
-
next_step = current_step + 1
|
82
|
-
|
83
|
-
if next_step == num_steps
|
84
|
-
final_form_list = (0...num_steps).map {|i| get_form(i, request.POST)}
|
85
|
-
|
86
|
-
final_form_list.each_with_index do |f, i|
|
87
|
-
return render_revalidation_failure(request, i, f) unless f.valid?
|
88
|
-
end
|
89
|
-
|
90
|
-
return done(request, final_form_list)
|
91
|
-
else
|
92
|
-
form = get_form(next_step)
|
93
|
-
@step = current_step = next_step
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
render(form, request, current_step)
|
98
|
-
end
|
99
|
-
|
100
|
-
def render(form, request, step, context=nil)
|
101
|
-
"Renders the given Form object, returning an HttpResponse." # FIXME
|
102
|
-
old_data = request.POST
|
103
|
-
prev_fields = []
|
104
|
-
|
105
|
-
if old_data
|
106
|
-
hidden = Widgets::HiddenInput.new
|
107
|
-
# Collect all data from previous steps and render it as HTML hidden fields.
|
108
|
-
(0...step).each do |i|
|
109
|
-
old_form = get_form(i, old_data)
|
110
|
-
hash_name = "hash_#{i}"
|
111
|
-
hash = old_data[hash_name] || security_hash(request, old_form)
|
112
|
-
prev_fields += old_form.map {|bf| bf.as_hidden}
|
113
|
-
prev_fields << hidden.render(hash_name, hash)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
render_template(request, form, prev_fields.join(''), step, context)
|
118
|
-
end
|
119
|
-
|
120
|
-
# METHODS SUBCLASSES MIGHT OVERRIDE IF APPROPRIATE
|
121
|
-
|
122
|
-
def prefix_for_step(step)
|
123
|
-
step.to_s
|
124
|
-
end
|
125
|
-
|
126
|
-
def render_hash_failure(request, step)
|
127
|
-
# Hook for rendering a template if a hash check failed.
|
128
|
-
|
129
|
-
# step is the step that failed. Any previous step is guaranteed to be
|
130
|
-
# valid.
|
131
|
-
|
132
|
-
# This default implementation simply renders the form for the given step,
|
133
|
-
# but subclasses may want to display an error message, etc.
|
134
|
-
render(get_form(step), request, step, :context => {:wizard_error => _('We apologize, but your form has expired. Please continue filling out the form from this page.')})
|
135
|
-
end
|
136
|
-
|
137
|
-
def render_revalidation_failure(request, step, form)
|
138
|
-
# Hook for rendering a template if final revalidation failed.
|
139
|
-
|
140
|
-
# It is highly unlikely that this point would ever be reached, but See
|
141
|
-
# the comment in __call__() for an explanation.
|
142
|
-
render(form, request, step)
|
143
|
-
end
|
144
|
-
|
145
|
-
def security_hash(request, form)
|
146
|
-
Utils::security_hash(request, form)
|
147
|
-
end
|
148
|
-
|
149
|
-
def determine_step(request, *args)
|
150
|
-
if request.post?
|
151
|
-
begin
|
152
|
-
Integer(request.POST.fetch(step_field_name, 0))
|
153
|
-
rescue ArgumentError
|
154
|
-
0
|
155
|
-
end
|
156
|
-
else
|
157
|
-
0
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def parse_params(request, *args)
|
162
|
-
end
|
163
|
-
|
164
|
-
def get_template(step)
|
165
|
-
'forms/wizard.erb'
|
166
|
-
end
|
167
|
-
|
168
|
-
def render_template(request, form, previous_fields, step, context=nil)
|
169
|
-
|
170
|
-
# Renders the template for the given step, returning an HttpResponse object.
|
171
|
-
|
172
|
-
# Override this method if you want to add a custom context, return a
|
173
|
-
# different MIME type, etc. If you only need to override the template
|
174
|
-
# name, use get_template() instead.
|
175
|
-
|
176
|
-
# The template will be rendered with the following context:
|
177
|
-
# step_field -- The name of the hidden field containing the step.
|
178
|
-
# step0 -- The current step (zero-based).
|
179
|
-
# step -- The current step (one-based).
|
180
|
-
# step_count -- The total number of steps.
|
181
|
-
# form -- The Form instance for the current step (either empty
|
182
|
-
# or with errors).
|
183
|
-
# previous_fields -- A string representing every previous data field,
|
184
|
-
# plus hashes for completed forms, all in the form of
|
185
|
-
# hidden fields. Note that you'll need to run this
|
186
|
-
# through the 'safe' template filter, to prevent
|
187
|
-
# auto-escaping, because it's raw HTML.
|
188
|
-
|
189
|
-
context ||= {}
|
190
|
-
# FIXME
|
191
|
-
render_to_response(get_template(step),
|
192
|
-
context.merge(:step_field => step_field_name,
|
193
|
-
:step0 => step,
|
194
|
-
:step => step + 1,
|
195
|
-
:step_count => num_steps,
|
196
|
-
:form => form,
|
197
|
-
:previous_fields => previous_fields),
|
198
|
-
:context_instance => RequestContext(request))
|
199
|
-
end
|
200
|
-
|
201
|
-
def process_step(request, form, step)
|
202
|
-
# Hook for modifying the FormWizard's internal state, given a fully
|
203
|
-
# validated Form object. The Form is guaranteed to have clean, valid
|
204
|
-
# data.
|
205
|
-
|
206
|
-
# This method should *not* modify any of that data. Rather, it might want
|
207
|
-
# to set self.extra_context or dynamically alter self.form_list, based on
|
208
|
-
# previously submitted forms.
|
209
|
-
|
210
|
-
# Note that this method is called every time a page is rendered for *all*
|
211
|
-
# submitted steps.
|
212
|
-
end
|
213
|
-
|
214
|
-
# METHODS SUBCLASSES MUST OVERRIDE ########################################
|
215
|
-
|
216
|
-
def done(request, form_list)
|
217
|
-
raise NotImplementedError.new("#{self.class.name} doesn't define the required 'done' method.")
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|