ezframe 0.0.4 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/asset/css/materialize.min.css +13 -0
- data/asset/css/style.css +3 -0
- data/{app_template/asset/image/favicon.ico → asset/image/c_e.ico} +0 -0
- data/{app_template/asset → asset}/js/ezframe.js +29 -59
- data/asset/js/materialize.min.js +6 -0
- data/asset/js/mymaterialize.js +38 -0
- data/exe/console +2 -2
- data/exe/{create_table.rb → create_table} +0 -0
- data/exe/dbmigrate +67 -0
- data/ezframe.gemspec +3 -0
- data/lib/ezframe/auth.rb +7 -2
- data/lib/ezframe/column_set.rb +30 -14
- data/lib/ezframe/column_type.rb +207 -67
- data/lib/ezframe/config.rb +5 -1
- data/lib/ezframe/controller.rb +34 -34
- data/lib/ezframe/database.rb +2 -2
- data/lib/ezframe/editor.rb +41 -41
- data/lib/ezframe/email.rb +34 -0
- data/lib/ezframe/ht.rb +20 -0
- data/lib/ezframe/html.rb +22 -14
- data/lib/ezframe/japanese_utils.rb +5 -0
- data/lib/ezframe/loader.rb +2 -2
- data/lib/ezframe/materialize.rb +3 -4
- data/lib/ezframe/message.rb +46 -0
- data/lib/ezframe/model.rb +0 -1
- data/lib/ezframe/page_base.rb +53 -67
- data/lib/ezframe/route.rb +122 -0
- data/lib/ezframe/server.rb +1 -1
- data/lib/ezframe/template.rb +3 -2
- data/lib/ezframe/util.rb +36 -16
- data/lib/ezframe/version.rb +1 -1
- data/lib/ezframe.rb +2 -1
- metadata +57 -14
- data/.rubocop.yml +0 -44
- data/app_template/config/generic.yml +0 -3
- data/app_template/config/materialize.yml +0 -5
- data/app_template/config.ru +0 -10
- data/app_template/pages/basic.rb +0 -5
- data/exe/setup.rb +0 -15
- data/lib/ezframe/page_kit.rb +0 -63
data/ezframe.gemspec
CHANGED
@@ -34,9 +34,12 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.add_development_dependency "minitest", '~> 5.13.0'
|
35
35
|
spec.add_development_dependency "nokogiri", '~> 1.10.7'
|
36
36
|
spec.add_development_dependency "rack-test", '~> 1.1.0'
|
37
|
+
spec.add_development_dependency "pry", '~> 0.12.2'
|
38
|
+
spec.add_development_dependency "mailcatcher", '~> 0.7.1'
|
37
39
|
|
38
40
|
spec.add_runtime_dependency "rake", "~> 13.0"
|
39
41
|
spec.add_runtime_dependency 'rack', '~> 2.0.7'
|
40
42
|
spec.add_runtime_dependency 'sequel', '~> 5.27.0'
|
41
43
|
spec.add_runtime_dependency 'sqlite3', '~> 1.4.0'
|
44
|
+
spec.add_runtime_dependency 'oj', '~> 3.10.2'
|
42
45
|
end
|
data/lib/ezframe/auth.rb
CHANGED
@@ -39,7 +39,7 @@ module Ezframe
|
|
39
39
|
def authenticate(env, account, pass)
|
40
40
|
model = env["model"]
|
41
41
|
raise "model is not initialized" unless model
|
42
|
-
@user = model.db.dataset(:
|
42
|
+
@user = model.db.dataset(Config[:login_table]).where(Config[:login_account].to_sym => account ).first
|
43
43
|
if @user
|
44
44
|
mylog "Auth: authenticate: user=#{@user.inspect}"
|
45
45
|
else
|
@@ -60,7 +60,12 @@ module Ezframe
|
|
60
60
|
|
61
61
|
def initialize(model, account)
|
62
62
|
self.account = account
|
63
|
-
|
63
|
+
dataset = model.db.dataset(Config[:login_table])
|
64
|
+
if account.is_a?(Integer)
|
65
|
+
@user = dataset.where(id: account).first
|
66
|
+
else
|
67
|
+
@user = dataset.where(Config[:login_account].to_sym => account).first
|
68
|
+
end
|
64
69
|
unless @user
|
65
70
|
mylog "Auth.initialize: This user does not exist: #{account}"
|
66
71
|
end
|
data/lib/ezframe/column_set.rb
CHANGED
@@ -16,18 +16,17 @@ module Ezframe
|
|
16
16
|
|
17
17
|
def load_one_file(filename)
|
18
18
|
table_name = $1 if filename =~ /(\w+).ya?ml$/
|
19
|
-
begin
|
19
|
+
#begin
|
20
20
|
yaml = YAML.load_file(filename)
|
21
|
-
rescue
|
22
|
-
|
23
|
-
|
24
|
-
end
|
21
|
+
#rescue
|
22
|
+
# raise "YAML load error: #{filename}"
|
23
|
+
#end
|
25
24
|
if yaml.length == 0
|
26
25
|
mylog("[ERROR] columns file is empty: #{filename}")
|
27
26
|
return
|
28
27
|
end
|
29
28
|
column_info = yaml.recursively_symbolize_keys
|
30
|
-
puts "load_one_file: filename=#{filename} column_info=#{column_info.inspect}"
|
29
|
+
# puts "load_one_file: filename=#{filename} column_info=#{column_info.inspect}"
|
31
30
|
add(table_name, column_info)
|
32
31
|
end
|
33
32
|
|
@@ -61,6 +60,7 @@ module Ezframe
|
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
63
|
+
# 配列を初期化する
|
64
64
|
def set(attr_a)
|
65
65
|
@columns[:id] = IdType.new(key: "id", label: "ID", no_edit: true)
|
66
66
|
attr_a.each do |attributes|
|
@@ -93,12 +93,13 @@ module Ezframe
|
|
93
93
|
return data
|
94
94
|
end
|
95
95
|
|
96
|
-
|
96
|
+
# 新規に値を登録する
|
97
|
+
def create
|
97
98
|
col_h = get_hash(:value)
|
98
99
|
col_h.delete(:id)
|
99
100
|
col_h.delete(:created_at)
|
100
101
|
col_h[:updated_at] = Time.now
|
101
|
-
mylog "
|
102
|
+
mylog "create: #{col_h.inspect}"
|
102
103
|
id = @columns[:id]
|
103
104
|
if id.value.to_i > 0
|
104
105
|
dataset.where(id: id.value).update(col_h)
|
@@ -107,14 +108,28 @@ module Ezframe
|
|
107
108
|
end
|
108
109
|
end
|
109
110
|
|
111
|
+
# データベース上の値の更新
|
110
112
|
def update(id, value_h)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
113
|
+
self.set_from_db(id)
|
114
|
+
updated_values = {}
|
115
|
+
@columns.each do |colkey, column|
|
116
|
+
next if column.no_edit?
|
117
|
+
if column.multi_inputs?
|
118
|
+
new_value = column.form_to_value(value_h)
|
119
|
+
else
|
120
|
+
new_value = value_h[colkey]
|
121
|
+
end
|
122
|
+
prev_value = column.value
|
123
|
+
column.value = new_value
|
124
|
+
if prev_value != column.value
|
125
|
+
updated_values[colkey] = column.value
|
126
|
+
end
|
127
|
+
end
|
128
|
+
mylog "column_set.updated_values = #{updated_values.inspect}"
|
129
|
+
if updated_values.length > 0
|
130
|
+
updated_values[:updated_at] = Time.now
|
131
|
+
dataset.where(id: id).update(updated_values)
|
115
132
|
end
|
116
|
-
dataset.where(id: id).update(values)
|
117
|
-
set_values(values)
|
118
133
|
end
|
119
134
|
|
120
135
|
def values=(value_h)
|
@@ -125,6 +140,7 @@ module Ezframe
|
|
125
140
|
def set_values(value_h)
|
126
141
|
return unless value_h
|
127
142
|
value_h.each do |k, v|
|
143
|
+
next if k.nil? || k.to_s.empty?
|
128
144
|
col = @columns[k.to_sym]
|
129
145
|
next unless col
|
130
146
|
col.value = v
|
data/lib/ezframe/column_type.rb
CHANGED
@@ -26,10 +26,11 @@ module Ezframe
|
|
26
26
|
|
27
27
|
def initialize(attr = nil)
|
28
28
|
@attribute = attr || {}
|
29
|
+
@value = @attribute[:default]
|
29
30
|
end
|
30
31
|
|
31
32
|
def key
|
32
|
-
@attribute[:key]
|
33
|
+
@attribute[:key].to_sym
|
33
34
|
end
|
34
35
|
|
35
36
|
def label
|
@@ -68,10 +69,14 @@ module Ezframe
|
|
68
69
|
@value
|
69
70
|
end
|
70
71
|
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
def normalize(val)
|
73
|
+
return val
|
74
|
+
end
|
75
|
+
|
76
|
+
def validate(val)
|
77
|
+
if !val || val.empty?
|
78
|
+
if @attribute[:required] == "true"
|
79
|
+
@error = "required"
|
75
80
|
return @error
|
76
81
|
end
|
77
82
|
end
|
@@ -85,41 +90,81 @@ module Ezframe
|
|
85
90
|
def no_view?
|
86
91
|
return (@attribute[:hidden] && !@attribute[:force])
|
87
92
|
end
|
93
|
+
|
94
|
+
def multi_inputs?
|
95
|
+
nil
|
96
|
+
end
|
88
97
|
end
|
89
98
|
|
90
99
|
class TextType < TypeBase
|
91
|
-
def normalize
|
92
|
-
return unless
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
100
|
+
def normalize(val)
|
101
|
+
return nil unless val
|
102
|
+
val = val.dup.to_s
|
103
|
+
val.gsub!(/ /, " ")
|
104
|
+
val.gsub!(/\s+/, " ")
|
105
|
+
val.strip!
|
106
|
+
return val
|
97
107
|
end
|
98
108
|
|
99
|
-
def value=(
|
100
|
-
|
101
|
-
normalize
|
109
|
+
def value=(val)
|
110
|
+
@value = normalize(val)
|
102
111
|
end
|
103
112
|
|
104
113
|
def form(opts = {})
|
105
114
|
return nil if no_edit? && !opts[:force]
|
106
|
-
|
107
|
-
|
108
|
-
|
115
|
+
if @attribute[:size]
|
116
|
+
val = @value
|
117
|
+
if val && val.length>0
|
118
|
+
val.gsub!(/\n/, "<br>")
|
119
|
+
end
|
120
|
+
h = Ht.textarea(name: self.key, class: "textarea-size-#{@attribute[:size]}", label: @attribute[:label], child: val)
|
121
|
+
else
|
122
|
+
h = Ht.input(type: "text", name: self.key, label: @attribute[:label], value: @value || "")
|
123
|
+
end
|
124
|
+
return h
|
109
125
|
end
|
110
126
|
|
111
127
|
def db_type
|
112
|
-
"text"
|
128
|
+
return "text"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
class TextareaType < TextType
|
133
|
+
def value=(val)
|
134
|
+
val = normalize(val)
|
135
|
+
val.gsub!(/<br>/, "\n") if val
|
136
|
+
@value = val
|
137
|
+
end
|
138
|
+
|
139
|
+
def form(opts = {})
|
140
|
+
return nil if no_edit? && !opts[:force]
|
141
|
+
val = @value
|
142
|
+
if val && val.length>0
|
143
|
+
val.gsub!(/\n/, "<br>")
|
144
|
+
end
|
145
|
+
h = Ht.textarea(name: self.key, label: @attribute[:label], child: val)
|
146
|
+
h[:class] = @attribute[:class] if @attribute[:class]
|
147
|
+
return h
|
113
148
|
end
|
114
149
|
end
|
115
150
|
|
116
151
|
class IntType < TextType
|
117
152
|
def view(opts = {})
|
118
153
|
return nil if no_view? && !opts[:force]
|
119
|
-
return
|
154
|
+
return @value.to_i.add_comma
|
120
155
|
end
|
121
156
|
|
122
157
|
def value=(v)
|
158
|
+
if v.nil?
|
159
|
+
default = @attribute[:default]
|
160
|
+
if default
|
161
|
+
@value = default
|
162
|
+
else
|
163
|
+
@value = nil
|
164
|
+
end
|
165
|
+
return
|
166
|
+
end
|
167
|
+
|
123
168
|
if v.nil?
|
124
169
|
@value = nil
|
125
170
|
return
|
@@ -132,22 +177,28 @@ module Ezframe
|
|
132
177
|
|
133
178
|
def form(opts = {})
|
134
179
|
return nil if no_edit? && !opts[:force]
|
135
|
-
|
180
|
+
h = Ht.input(type: "number", name: self.key, label: @attribute[:label], value: @value || "")
|
181
|
+
h[:class] = @attribute[:class] if @attribute[:class]
|
182
|
+
return h
|
136
183
|
end
|
137
184
|
|
138
185
|
def db_type
|
139
|
-
"int"
|
186
|
+
return "int"
|
140
187
|
end
|
141
|
-
|
142
|
-
|
143
188
|
end
|
144
189
|
|
145
190
|
class ForeignType < IntType
|
191
|
+
def initialize(attr = nil)
|
192
|
+
super
|
193
|
+
@attribute[:no_edit] = true
|
194
|
+
end
|
195
|
+
|
146
196
|
def view(opts = {})
|
147
197
|
return nil if no_view? && !opts[:force]
|
148
|
-
|
149
|
-
|
150
|
-
|
198
|
+
return nil
|
199
|
+
# dataset = @parent.parent.model.db.dataset(self.key)
|
200
|
+
# data = dataset.get(id: @value)
|
201
|
+
# return data[@attribute[:view]]
|
151
202
|
end
|
152
203
|
|
153
204
|
def form
|
@@ -169,7 +220,9 @@ module Ezframe
|
|
169
220
|
class PasswordType < TextType
|
170
221
|
def form(opts = {})
|
171
222
|
return nil if no_edit? && !opts[:force]
|
172
|
-
|
223
|
+
h = { tag: "input", type: "password", name: self.key, label: @attribute[:label], value: @value || "" }
|
224
|
+
h[:class] = @attribute[:class] if @attribute[:class]
|
225
|
+
return h
|
173
226
|
end
|
174
227
|
|
175
228
|
def db_value
|
@@ -180,23 +233,33 @@ module Ezframe
|
|
180
233
|
class SelectType < TypeBase
|
181
234
|
def form(opts = {})
|
182
235
|
return nil if no_edit? && !opts[:force]
|
183
|
-
# puts "selectType: #{@attribute[:
|
184
|
-
|
236
|
+
# puts "selectType: #{@attribute[:item].inspect}"
|
237
|
+
h = { tag: "select", name: self.key, label: @attribute[:label], item: @attribute[:item], value: @value }
|
238
|
+
h[:class] = @attribute[:class] if @attribute[:class]
|
239
|
+
return h
|
185
240
|
end
|
186
241
|
|
187
242
|
def db_type
|
188
243
|
return "text"
|
189
244
|
end
|
245
|
+
|
246
|
+
def view(opts = {})
|
247
|
+
return nil if no_view? && !opts[:force]
|
248
|
+
item = @attribute[:item]
|
249
|
+
return item[@value]
|
250
|
+
end
|
190
251
|
end
|
191
252
|
|
192
253
|
class CheckboxType < TypeBase
|
193
254
|
def form(opts = {})
|
194
255
|
return nil if no_edit? && !opts[:force]
|
195
|
-
|
256
|
+
h = Ht.checkbox(name: self.key, value: parent[:id].value, label: @attribute[:label])
|
257
|
+
h[:class] = @attribute[:class] if @attribute[:class]
|
258
|
+
return h
|
196
259
|
end
|
197
260
|
|
198
261
|
def db_type
|
199
|
-
return "
|
262
|
+
return "text"
|
200
263
|
end
|
201
264
|
end
|
202
265
|
|
@@ -205,10 +268,11 @@ module Ezframe
|
|
205
268
|
return nil if no_edit? && !opts[:force]
|
206
269
|
h = super
|
207
270
|
if h
|
208
|
-
#
|
271
|
+
# h[:type] = 'date'
|
209
272
|
h[:type] = "text"
|
210
|
-
h[:
|
211
|
-
h[:
|
273
|
+
h[:value] = @value || ""
|
274
|
+
h[:class] = [ "datepicker" ]
|
275
|
+
h[:class].push@attribute[:class] if @attribute[:class]
|
212
276
|
end
|
213
277
|
return h
|
214
278
|
end
|
@@ -226,7 +290,12 @@ module Ezframe
|
|
226
290
|
|
227
291
|
def value=(v)
|
228
292
|
if v.nil?
|
229
|
-
|
293
|
+
default = @attribute[:default]
|
294
|
+
if default
|
295
|
+
@value = default
|
296
|
+
else
|
297
|
+
@value = nil
|
298
|
+
end
|
230
299
|
return
|
231
300
|
end
|
232
301
|
if v.is_a?(String)
|
@@ -235,7 +304,6 @@ module Ezframe
|
|
235
304
|
return
|
236
305
|
end
|
237
306
|
y, m, d = v.split(/[\-\/]/)
|
238
|
-
# puts "date=#{v.inspect}"
|
239
307
|
@value = Date.new(y.to_i, m.to_i, d.to_i)
|
240
308
|
return
|
241
309
|
end
|
@@ -265,23 +333,50 @@ module Ezframe
|
|
265
333
|
end
|
266
334
|
end
|
267
335
|
|
268
|
-
class BirthdayType <
|
336
|
+
class BirthdayType < TextType
|
269
337
|
def form(opts = {})
|
270
338
|
return nil if no_edit? && !opts[:force]
|
271
|
-
prefix =
|
339
|
+
prefix = self.key
|
272
340
|
now = Time.now
|
273
341
|
year_list = []
|
274
342
|
110.times do |y|
|
275
343
|
year = now.year - y - 10
|
276
344
|
year_list.push [year, "#{year}年 (#{Japanese.convert_wareki(year)})"]
|
277
345
|
end
|
346
|
+
|
347
|
+
year, mon, mday = parse_date(@value)
|
278
348
|
mon_list = (1..12).map { |m| [m, "#{m}月"] }
|
279
349
|
mon_list.unshift([0, "(月)"])
|
280
350
|
mday_list = (1..31).map { |d| [d, "#{d}日"] }
|
281
351
|
mday_list.unshift([0, "(日)"])
|
282
|
-
return [Ht.select(name: "#{prefix}_year",
|
283
|
-
Ht.select(name: "#{prefix}_mon",
|
284
|
-
Ht.select(name: "#{prefix}_mday",
|
352
|
+
return [Ht.select(name: "#{prefix}_year", item: year_list, value: year),
|
353
|
+
Ht.select(name: "#{prefix}_mon", item: mon_list, value: mon),
|
354
|
+
Ht.select(name: "#{prefix}_mday", item: mday_list, value: mday)]
|
355
|
+
end
|
356
|
+
|
357
|
+
def view(opts = {})
|
358
|
+
return nil if no_view? && !opts[:force]
|
359
|
+
return nil unless @value
|
360
|
+
year, mon, mday = parse_date(@value)
|
361
|
+
mon = "?" if mon == 0
|
362
|
+
mday = "?" if mday == 0
|
363
|
+
return "#{year}年 #{mon}月 #{mday}日"
|
364
|
+
end
|
365
|
+
|
366
|
+
def parse_date(date)
|
367
|
+
if date && date =~ /(\d+)\-(\d+)\-(\d+)/
|
368
|
+
return [ $1.to_i,$2.to_i,$3.to_i ]
|
369
|
+
end
|
370
|
+
return nil
|
371
|
+
end
|
372
|
+
|
373
|
+
def multi_inputs?
|
374
|
+
true
|
375
|
+
end
|
376
|
+
|
377
|
+
def form_to_value(form)
|
378
|
+
y, m, d = form["#{self.key}_year".to_sym], form["#{self.key}_mon".to_sym], form["#{self.key}_mday".to_sym]
|
379
|
+
return "#{y.to_i}-#{m.to_i}-#{d.to_i}"
|
285
380
|
end
|
286
381
|
end
|
287
382
|
|
@@ -290,62 +385,93 @@ module Ezframe
|
|
290
385
|
return nil if no_edit? && !opts[:force]
|
291
386
|
h = super
|
292
387
|
h[:type] = "email" if h
|
388
|
+
h[:class] = @attribute[:class] if @attribute[:class]
|
293
389
|
return h
|
294
390
|
end
|
295
391
|
|
296
|
-
def normalize
|
297
|
-
return unless
|
298
|
-
|
392
|
+
def normalize(val)
|
393
|
+
return nil unless val
|
394
|
+
return NKF.nkf('-w -Z4', val)
|
299
395
|
end
|
300
396
|
|
301
|
-
def validate
|
302
|
-
super
|
397
|
+
def validate(val)
|
398
|
+
super(val)
|
303
399
|
return @error if @error
|
304
|
-
if email_format?
|
305
|
-
@error =
|
400
|
+
if email_format?(val)
|
401
|
+
@error = :invalid_value
|
306
402
|
return @error
|
307
403
|
end
|
308
404
|
return nil
|
309
405
|
end
|
310
406
|
|
311
|
-
def email_format?
|
312
|
-
return nil unless
|
313
|
-
return
|
407
|
+
def email_format?(val)
|
408
|
+
return nil unless val
|
409
|
+
return val.to_s =~ /^[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
|
314
410
|
end
|
315
411
|
end
|
316
412
|
|
317
413
|
class TelType < TextType
|
318
|
-
def validate
|
319
|
-
super
|
414
|
+
def validate(val)
|
415
|
+
super(val)
|
320
416
|
return @error if @error
|
321
|
-
unless /^0\d{9,10}$/ =~
|
322
|
-
@error =
|
417
|
+
unless /^0\d{9,10}$/ =~ val.to_s
|
418
|
+
@error = :invalid_value
|
323
419
|
return @error
|
324
420
|
end
|
421
|
+
return nil
|
422
|
+
end
|
423
|
+
|
424
|
+
def normalize(val)
|
425
|
+
return nil unless val
|
426
|
+
val = super(val)
|
427
|
+
val = val.tr("0-9", "0-9")
|
428
|
+
val = val.gsub(/\D+/, "")
|
429
|
+
return val
|
325
430
|
end
|
326
431
|
end
|
327
432
|
|
328
433
|
class JpnameType < TextType
|
329
434
|
end
|
330
435
|
|
331
|
-
class
|
332
|
-
def normalize
|
333
|
-
|
334
|
-
|
335
|
-
@value.tr!("ァ-ン", "ぁ-ん")
|
436
|
+
class KatakanaType < TextType
|
437
|
+
def normalize(val)
|
438
|
+
val = super(val)
|
439
|
+
return val.tr("ァ-ン", "ぁ-ん")
|
336
440
|
end
|
337
441
|
|
338
|
-
def
|
339
|
-
|
340
|
-
|
442
|
+
def validate(val)
|
443
|
+
super(val)
|
444
|
+
return @error if @error
|
445
|
+
unless /^[ぁ-ん ]+$/ =~ val.to_s
|
446
|
+
@error = :hiragana_only
|
447
|
+
return @error
|
448
|
+
end
|
449
|
+
return nil
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
class KatakanaType < TextType
|
454
|
+
def normalize(val)
|
455
|
+
return nil unless val
|
456
|
+
val = super(val)
|
457
|
+
return val.tr("ぁ-ん", "ァ-ン")
|
458
|
+
end
|
459
|
+
|
460
|
+
def validate(val)
|
461
|
+
super(val)
|
462
|
+
return @error if @error
|
463
|
+
unless /^[ァ-ン ]+$/ =~ val
|
464
|
+
@error = :katakana_only
|
465
|
+
return @error
|
341
466
|
end
|
467
|
+
return nil
|
342
468
|
end
|
343
469
|
end
|
344
470
|
|
345
471
|
class PrefectureType < SelectType
|
346
472
|
def initialize(attr)
|
347
473
|
super(attr)
|
348
|
-
@pref_a = %w[
|
474
|
+
@pref_a = %w[() 北海道 青森県 岩手県 宮城県 秋田県 山形県 福島県
|
349
475
|
茨城県 栃木県 群馬県 埼玉県 千葉県 東京都 神奈川県
|
350
476
|
新潟県 富山県 石川県 福井県 山梨県 長野県 岐阜県 静岡県 愛知県
|
351
477
|
三重県 滋賀県 京都府 大阪府 兵庫県 奈良県 和歌山県
|
@@ -359,11 +485,12 @@ module Ezframe
|
|
359
485
|
def form(opts = {})
|
360
486
|
return nil if no_edit? && !opts[:force]
|
361
487
|
h = super
|
362
|
-
h[:
|
488
|
+
h[:item] = @pref_h
|
363
489
|
return h
|
364
490
|
end
|
365
491
|
|
366
492
|
def view
|
493
|
+
return nil if no_view? && !opts[:force]
|
367
494
|
return @pref_h[@value.to_i]
|
368
495
|
end
|
369
496
|
end
|
@@ -376,8 +503,21 @@ module Ezframe
|
|
376
503
|
return @value.to_s.gsub(/(\d{3})(\d{4})/) { "#{$1}-#{$2}" }
|
377
504
|
end
|
378
505
|
|
379
|
-
def
|
380
|
-
|
506
|
+
def normalize(val)
|
507
|
+
val = super(val)
|
508
|
+
return nil unless val
|
509
|
+
val = val.tr("0-9", "0-9")
|
510
|
+
return val
|
511
|
+
end
|
512
|
+
|
513
|
+
def validate(val)
|
514
|
+
super(val)
|
515
|
+
return @error if @error
|
516
|
+
unless /^\d{7}$/ =~ val.to_s
|
517
|
+
@error = :invalid_value
|
518
|
+
return @error
|
519
|
+
end
|
520
|
+
return nil
|
381
521
|
end
|
382
522
|
end
|
383
523
|
end
|
data/lib/ezframe/config.rb
CHANGED
@@ -12,8 +12,12 @@ module Ezframe
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def load_one_file(filename)
|
15
|
+
instr = File.open(filename, &:read)
|
16
|
+
if instr.index("\#{")
|
17
|
+
instr = Template.fill_in_text(instr)
|
18
|
+
end
|
15
19
|
begin
|
16
|
-
yaml = YAML.
|
20
|
+
yaml = YAML.load(instr)
|
17
21
|
rescue
|
18
22
|
mylog("YAML load error: #{filename}")
|
19
23
|
return
|
data/lib/ezframe/controller.rb
CHANGED
@@ -1,60 +1,60 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require "oj"
|
2
3
|
|
3
4
|
module Ezframe
|
4
|
-
class
|
5
|
+
class Controller
|
5
6
|
class << self
|
6
|
-
def
|
7
|
-
@request = request
|
7
|
+
def init
|
8
8
|
Config.load_files("./config")
|
9
9
|
Model.init
|
10
|
-
|
10
|
+
Message.init
|
11
11
|
Auth.init_warden if defined?(Warden)
|
12
|
+
end
|
13
|
+
|
14
|
+
def exec(request, response)
|
15
|
+
@request = request
|
16
|
+
model = Model.get_clone
|
12
17
|
@request.env["model"] = model
|
13
18
|
|
14
19
|
mylog("exec: path=#{request.path_info} params=#{request.params}")
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
response
|
19
|
-
response.body = [ Html.convert(Ht.p("file not found")) ]
|
20
|
+
page_instance, method, url_params = Route::choose(request)
|
21
|
+
mylog "page: #{page_instance.class}, method=#{method}, url_params=#{url_params}"
|
22
|
+
if !page_instance || page_instance == 404
|
23
|
+
file_not_found(response)
|
20
24
|
return
|
21
25
|
end
|
22
|
-
|
23
|
-
|
24
|
-
if request.post?
|
25
|
-
method_full_name = "public_#{method}_post"
|
26
|
-
else
|
27
|
-
method_full_name = "public_#{method}_page"
|
28
|
-
end
|
29
|
-
if page.auth
|
30
|
-
warden.authenticate!
|
31
|
-
end
|
32
|
-
# request.env["rack.session"]["kamatest"]="usable"
|
33
|
-
# mylog "method: #{klass}.#{method_full_name}"
|
34
|
-
#mylog "rack.session.id=#{request.env['rack.session'].id}"
|
26
|
+
@request.env["url_params"] = url_params
|
27
|
+
warden.authenticate! if page_instance.auth
|
35
28
|
mylog "rack.session.keys=#{request.env['rack.session'].keys}"
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
else
|
41
|
-
mylog "no such method: #{method_full_name}"
|
42
|
-
page.public_default_page
|
43
|
-
end
|
29
|
+
page_instance.set_request(@request)
|
30
|
+
body = page_instance.send(method)
|
31
|
+
|
32
|
+
# 戻り値によるレスポンス生成
|
44
33
|
if body.is_a?(Hash) || body.is_a?(Array)
|
34
|
+
# puts "Controller: body = #{body}"
|
45
35
|
response.body = [ JSON.generate(body) ]
|
36
|
+
# response.body = [ Oj.dump(body) ]
|
46
37
|
response['Content-Type'] = 'application/json; charset=utf-8'
|
47
38
|
else
|
48
39
|
response.body = [ body ]
|
49
40
|
response['Content-Type'] = 'text/html; charset=utf-8'
|
50
41
|
end
|
51
42
|
response.status = 200
|
43
|
+
# puts response.body
|
52
44
|
end
|
53
45
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
#
|
46
|
+
def file_not_found(response)
|
47
|
+
response.status = 404
|
48
|
+
response['Content-Type'] = 'text/html; charset=utf-8'
|
49
|
+
template_file = ("#{Config[:template_dir]}/404.html")
|
50
|
+
# puts template_file
|
51
|
+
if File.exist?(template_file)
|
52
|
+
body = File.read(template_file)
|
53
|
+
else
|
54
|
+
body = Html.convert(Ht.p("file not found"))
|
55
|
+
end
|
56
|
+
response.body = [ body ]
|
57
|
+
end
|
58
58
|
|
59
59
|
def warden
|
60
60
|
@request.env["warden"]
|