ezframe 0.2.0 → 0.3.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/Gemfile +2 -0
- data/exe/check_column_yml +1 -1
- data/exe/dbmigrate +112 -90
- data/lib/ezframe.rb +6 -1
- data/lib/ezframe/auth.rb +31 -22
- data/lib/ezframe/column_set.rb +63 -37
- data/lib/ezframe/column_type.rb +85 -49
- data/lib/ezframe/config.rb +4 -4
- data/lib/ezframe/controller.rb +6 -6
- data/lib/ezframe/database.rb +20 -13
- data/lib/ezframe/editor.rb +5 -5
- data/lib/ezframe/editor_common.rb +56 -0
- data/lib/ezframe/{logger.rb → ezlog.rb} +7 -6
- data/lib/ezframe/ht.rb +1 -1
- data/lib/ezframe/html.rb +2 -2
- data/lib/ezframe/main_editor.rb +238 -0
- data/lib/ezframe/materialize.rb +4 -4
- data/lib/ezframe/message.rb +3 -3
- data/lib/ezframe/page_base.rb +9 -9
- data/lib/ezframe/route.rb +12 -9
- data/lib/ezframe/server.rb +10 -3
- data/lib/ezframe/single_page_editor.rb +205 -0
- data/lib/ezframe/sub_editor.rb +222 -0
- data/lib/ezframe/template.rb +1 -1
- data/lib/ezframe/util.rb +9 -5
- data/lib/ezframe/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ab67d7d24a058acd24e2df411c31371b3470d5f448950b226bb6a0073690625
|
4
|
+
data.tar.gz: 9a244d5b2c0265c38cdff614b086a56d29ef0570cc4eb4ae38136d1d34709a76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0544756cb9b1ff1db515424425bbe2cc0682f6671c51e5e14d4dc1464bdb73f486d5b5cafc471d2e1da8e1a12a19178c8728fb6f6bc3d5ceceaa58c1fd445b9c
|
7
|
+
data.tar.gz: b823cb688787f08e492bc9b2fc2f517bef2e417d64c099f041a4174042ee39e2e5bb6fbb52a0978f9e79a95ef30c9e09eb4780407434f576cb3b06c4b27427cb
|
data/Gemfile
ADDED
data/exe/check_column_yml
CHANGED
@@ -47,7 +47,7 @@ Dir["column/*.yml"].each do |file|
|
|
47
47
|
if dup && dup.length > 0
|
48
48
|
puts "#{file}\n#{dup}"
|
49
49
|
end
|
50
|
-
yaml = YAML.
|
50
|
+
yaml = YAML.load(File.open(file), symbolize_names: true)
|
51
51
|
upper = Object.const_get("Ezframe")
|
52
52
|
yaml.each do |column|
|
53
53
|
type = column["type"]
|
data/exe/dbmigrate
CHANGED
@@ -3,108 +3,129 @@
|
|
3
3
|
require "ezframe"
|
4
4
|
include Ezframe
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
6
|
+
module Ezframe
|
7
|
+
module Model
|
8
|
+
class DBInfo
|
9
|
+
def initialize
|
10
|
+
@db_columns = {}
|
11
|
+
@db_typ = get_database_type(Config[:database])
|
12
|
+
case @db_typ
|
13
|
+
when "postgresql"
|
14
|
+
get_info_from_postgres
|
15
|
+
when "sqlite"
|
16
|
+
get_info_from_sqlite
|
17
|
+
else
|
18
|
+
raise "unknown database system"
|
19
|
+
end
|
17
20
|
end
|
18
|
-
return nil
|
19
|
-
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
sql = "SELECT column_name,data_type FROM information_schema.columns WHERE table_name = '#{table_name}'"
|
24
|
-
begin
|
25
|
-
data_a = DB.sequel[sql].all
|
26
|
-
rescue
|
27
|
-
return nil
|
22
|
+
def get_db_info(table_name)
|
23
|
+
return @db_columns[table_name.to_sym]
|
28
24
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
25
|
+
|
26
|
+
def get_info_from_postgres
|
27
|
+
sql = "SELECT * FROM information_schema.columns"
|
28
|
+
begin
|
29
|
+
data_a = DB.sequel[sql].all
|
30
|
+
rescue => e
|
31
|
+
EzLog.error("get_info_from_postgres: #{e}")
|
32
|
+
return nil
|
33
|
+
end
|
34
|
+
data_a.each do |row|
|
35
|
+
table_name, col_name = row[:table_name], row[:column_name]
|
36
|
+
next if col_name.nil? || table_name.nil?
|
37
|
+
next unless ColumnSets.refer(table_name)
|
38
|
+
@db_columns[table_name.to_sym] ||= {}
|
39
|
+
@db_columns[table_name.to_sym][col_name.to_sym] = normalize_dbtype(row[:data_type])
|
40
|
+
end
|
32
41
|
end
|
33
|
-
return dbcol
|
34
|
-
end
|
35
42
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
def get_info_from_sqlite
|
44
|
+
sql = "SELECT * from sqlite_master;"
|
45
|
+
data_a = DB.sequel[sql].all
|
46
|
+
return nil unless data_a
|
47
|
+
data_a.each do |data|
|
48
|
+
sql = data[:sql]
|
49
|
+
parse_create_sql(sql)
|
50
|
+
end
|
51
|
+
end
|
43
52
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
53
|
+
def parse_create_sql(sql)
|
54
|
+
sql.gsub(/CREATE TABLE \`(\w+)\` \(/i, "")
|
55
|
+
table_name = $1
|
56
|
+
@db_columns[table_name.to_sym] ||= {}
|
57
|
+
column_a = sql.split(", ")
|
58
|
+
column_a.each do |line|
|
59
|
+
if line =~ /\`(\w+)\`\s(\w+)/
|
60
|
+
colkey, dbtype = $1, $2
|
61
|
+
@db_columns[table_name.to_sym][colkey.to_sym] = dbtype
|
62
|
+
end
|
52
63
|
end
|
53
64
|
end
|
54
|
-
return dbcol
|
55
|
-
end
|
56
65
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
66
|
+
def get_database_type(config)
|
67
|
+
return config.split("://")[0]
|
68
|
+
end
|
62
69
|
|
63
|
-
def exec_sql(sql)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
70
|
+
def exec_sql(sql)
|
71
|
+
begin
|
72
|
+
DB.sequel.run(sql)
|
73
|
+
rescue => e
|
74
|
+
EzLog.error("dbmigrate: exec_sql: #{e}")
|
75
|
+
end
|
76
|
+
end
|
70
77
|
|
71
|
-
def normalize_dbtype(dbtype)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
78
|
+
def normalize_dbtype(dbtype)
|
79
|
+
return nil unless dbtype
|
80
|
+
return "int" if dbtype == "integer"
|
81
|
+
return "timestamp" if dbtype.index("timestamp")
|
82
|
+
return dbtype
|
83
|
+
end
|
77
84
|
|
78
|
-
def set_default(column)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
85
|
+
def set_default(column)
|
86
|
+
default_value = column.attribute[:default]
|
87
|
+
if default_value
|
88
|
+
unless %w[int].include?(column.db_type)
|
89
|
+
default_value = "'#{default_value}'"
|
90
|
+
end
|
91
|
+
exec_sql("ALTER TABLE #{column.parent.name} ALTER #{column.key} SET DEFAULT #{default_value}")
|
92
|
+
end
|
93
|
+
end
|
87
94
|
|
88
|
-
def check_diff(column_set)
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
95
|
+
def check_diff(column_set)
|
96
|
+
table_name = column_set.name
|
97
|
+
dbcols = get_db_info(table_name)
|
98
|
+
unless dbcols
|
99
|
+
ColumnSets.create_one_table(table_name, ColumnSets.get(table_name.to_sym))
|
100
|
+
return
|
101
|
+
end
|
102
|
+
column_set.each do |column|
|
103
|
+
next if %w[id updated_at created_at deleted_at].include?(column.key.to_s)
|
104
|
+
dbtype = dbcols[column.key]
|
105
|
+
new_type = column.db_type
|
106
|
+
if !new_type || new_type.empty?
|
107
|
+
EzLog.error("check_diff: no db_type: table=#{table_name}:key=#{column.key}")
|
108
|
+
next
|
109
|
+
end
|
110
|
+
unless dbtype
|
111
|
+
exec_sql("ALTER TABLE #{table_name} ADD #{column.key} #{new_type};")
|
112
|
+
set_default(column)
|
113
|
+
next
|
114
|
+
end
|
115
|
+
if dbtype != new_type
|
116
|
+
exec_sql("ALTER TABLE #{table_name} ALTER COLUMN #{column.key} DROP DEFAULT;")
|
117
|
+
begin
|
118
|
+
exec_sql("ALTER TABLE #{table_name} ALTER #{column.key} TYPE #{new_type};")
|
119
|
+
rescue => e
|
120
|
+
EzLog.error("alter column type error: #{e.class}:#{e}:#{e.backtrace}")
|
121
|
+
back_key = "#{column.key}_bak"
|
122
|
+
exec_sql("ALTER TABLE #{table_name} RENAME #{column.key} TO #{back_key};")
|
123
|
+
end
|
124
|
+
set_default(column)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
# exec_sql("ALTER TABLE #{table_name} add COLUMN deleted_at timestamp;")
|
128
|
+
end
|
108
129
|
end
|
109
130
|
end
|
110
131
|
end
|
@@ -112,7 +133,8 @@ end
|
|
112
133
|
Config.init
|
113
134
|
DB.init
|
114
135
|
ColumnSets.init
|
136
|
+
dbinfo = Model::DBInfo.new
|
115
137
|
|
116
138
|
ColumnSets.each do |table_name, column_set|
|
117
|
-
check_diff(column_set)
|
139
|
+
dbinfo.check_diff(column_set)
|
118
140
|
end
|
data/lib/ezframe.rb
CHANGED
@@ -5,10 +5,11 @@ require "sequel"
|
|
5
5
|
require "json"
|
6
6
|
require "nkf"
|
7
7
|
require "date"
|
8
|
+
require "bcrypt"
|
8
9
|
|
9
10
|
require_relative 'ezframe/version'
|
10
11
|
require_relative 'ezframe/util'
|
11
|
-
require_relative 'ezframe/
|
12
|
+
require_relative 'ezframe/ezlog'
|
12
13
|
require_relative 'ezframe/config'
|
13
14
|
require_relative 'ezframe/controller'
|
14
15
|
require_relative 'ezframe/japanese_utils'
|
@@ -19,6 +20,10 @@ require_relative 'ezframe/ht'
|
|
19
20
|
require_relative 'ezframe/html'
|
20
21
|
require_relative 'ezframe/materialize'
|
21
22
|
require_relative 'ezframe/page_base'
|
23
|
+
require_relative 'ezframe/editor_common'
|
24
|
+
require_relative 'ezframe/main_editor'
|
25
|
+
require_relative 'ezframe/sub_editor'
|
26
|
+
require_relative 'ezframe/single_page_editor'
|
22
27
|
require_relative 'ezframe/template'
|
23
28
|
require_relative 'ezframe/server'
|
24
29
|
require_relative 'ezframe/message'
|
data/lib/ezframe/auth.rb
CHANGED
@@ -5,26 +5,28 @@ module Ezframe
|
|
5
5
|
|
6
6
|
def init
|
7
7
|
Warden::Manager.serialize_into_session do |auth|
|
8
|
-
#
|
8
|
+
# EzLog.info "serialize_into: #{auth.inspect}"
|
9
9
|
auth.user[:id]
|
10
10
|
end
|
11
11
|
Warden::Manager.serialize_from_session do |account|
|
12
|
-
#
|
12
|
+
# EzLog.info "serialize_from: account = #{account}"
|
13
13
|
inst = Auth.get(account)
|
14
|
-
#
|
14
|
+
# EzLog.info "inst = #{inst.inspect}"
|
15
15
|
inst
|
16
16
|
end
|
17
17
|
Warden::Strategies.add(:mystrategy) do
|
18
18
|
def valid?
|
19
|
-
#
|
19
|
+
# EzLog.info "valid?"
|
20
20
|
params["account"] || params["password"]
|
21
21
|
end
|
22
22
|
|
23
23
|
def authenticate!
|
24
|
-
|
24
|
+
EzLog.info "mystrategy.authenticate!: user=#{user}, params=#{params}"
|
25
25
|
if Auth.authenticate(env, params["account"], params["password"])
|
26
|
+
EzLog.info "mystrategy.authenticate!: success: user=#{user}"
|
26
27
|
success!(Auth.get(params["account"]))
|
27
28
|
else
|
29
|
+
EzLog.info "mystrategy.authenticate!: failed: user=#{user}"
|
28
30
|
fail!(Message[:login_failure])
|
29
31
|
end
|
30
32
|
end
|
@@ -36,26 +38,29 @@ module Ezframe
|
|
36
38
|
end
|
37
39
|
|
38
40
|
def authenticate(env, account, pass)
|
39
|
-
|
41
|
+
return nil if !pass || pass.strip.empty?
|
42
|
+
EzLog.debug("Auth.self.authenticate: account=#{account}, pass=#{pass}")
|
40
43
|
auth_conf = Config[:auth]
|
41
|
-
|
42
|
-
if
|
43
|
-
|
44
|
+
user_data = DB.dataset(auth_conf[:table]).where(auth_conf[:user].to_sym => account ).first
|
45
|
+
if user_data
|
46
|
+
EzLog.info "Auth: self.authenticate: has user: #{@user}"
|
44
47
|
else
|
45
|
-
|
48
|
+
EzLog.info "Auth.self.authenticate: this user does not exist: #{account}"
|
46
49
|
return nil
|
47
50
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
bcrypt
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
51
|
+
db_pass = user_data[auth_conf[:password].to_sym]
|
52
|
+
user_data.delete(:password)
|
53
|
+
return nil if !db_pass || db_pass.strip.length < 8
|
54
|
+
bcrypt = BCrypt::Password.new(db_pass)
|
55
|
+
if bcrypt == pass
|
56
|
+
env['rack.session'][:user] = user_data[:id]
|
57
|
+
@user = user_data
|
58
|
+
EzLog.debug("Auth.self.authenticate: success: password match!")
|
59
|
+
return true
|
60
|
+
else
|
61
|
+
EzLog.debug("Auth.self.authenticate: failure: password mismatch")
|
62
|
+
end
|
63
|
+
return nil
|
59
64
|
end
|
60
65
|
end
|
61
66
|
|
@@ -71,11 +76,15 @@ module Ezframe
|
|
71
76
|
@user = dataset.where(auth_conf[:user].to_sym => account).first
|
72
77
|
end
|
73
78
|
unless @user
|
74
|
-
|
79
|
+
EzLog.error "Auth.initialize: This user does not exist: #{account}"
|
75
80
|
return
|
76
81
|
end
|
77
82
|
self.password = @user[auth_conf[:password].to_sym]
|
78
83
|
@user.delete(:password)
|
79
84
|
end
|
85
|
+
|
86
|
+
def inspect
|
87
|
+
"account=#{@account}, user=#{@user}, id=#{@id}"
|
88
|
+
end
|
80
89
|
end
|
81
90
|
end
|
data/lib/ezframe/column_set.rb
CHANGED
@@ -19,12 +19,12 @@ module Ezframe
|
|
19
19
|
|
20
20
|
def load_one_file(filename)
|
21
21
|
colset_name = $1 if filename =~ /(\w+).ya?ml$/
|
22
|
-
yaml = YAML.
|
22
|
+
yaml = YAML.load(File.open(filename), symbolize_names: true)
|
23
23
|
if yaml.length == 0
|
24
|
-
|
24
|
+
EzLog.error("[ERROR] columns file is empty: #{filename}")
|
25
25
|
return
|
26
26
|
end
|
27
|
-
column_info = yaml.recursively_symbolize_keys
|
27
|
+
column_info = yaml # .recursively_symbolize_keys
|
28
28
|
# puts "load_one_file: filename=#{filename} column_info=#{column_info.inspect}"
|
29
29
|
add(colset_name, column_info)
|
30
30
|
end
|
@@ -59,13 +59,14 @@ module Ezframe
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def each
|
62
|
-
@colset_h.each {
|
62
|
+
@colset_h.each {|k, v| yield(k, v) }
|
63
63
|
end
|
64
64
|
|
65
65
|
def inspect
|
66
|
-
@colset_h.
|
67
|
-
"[#{name}]:#{colset.inspect}"
|
68
|
-
|
66
|
+
return @colset_h.map do |name, colset|
|
67
|
+
# "[#{name}]:#{colset.inspect}"
|
68
|
+
"[#{name}]:\n"
|
69
|
+
end.join
|
69
70
|
end
|
70
71
|
|
71
72
|
def create_tables
|
@@ -73,14 +74,14 @@ module Ezframe
|
|
73
74
|
begin
|
74
75
|
create_one_table(table_name, column_set)
|
75
76
|
rescue => e
|
76
|
-
|
77
|
+
EzLog.error("create_tables: #{e.inspect}\n#{$@.inspect}")
|
77
78
|
end
|
78
79
|
end
|
79
80
|
end
|
80
81
|
|
81
82
|
def create_one_table(table_name, column_set)
|
82
83
|
col_h = column_set.get_hash(:db_type)
|
83
|
-
|
84
|
+
EzLog.info "create_one_table: col_h=#{col_h.inspect}"
|
84
85
|
DB.create_table(table_name, col_h)
|
85
86
|
end
|
86
87
|
|
@@ -102,7 +103,7 @@ module Ezframe
|
|
102
103
|
if @colset_h[key]
|
103
104
|
foreign_table = key
|
104
105
|
else
|
105
|
-
|
106
|
+
EzLog.error "There is no related table: #{key}"
|
106
107
|
next
|
107
108
|
end
|
108
109
|
end
|
@@ -166,13 +167,13 @@ module Ezframe
|
|
166
167
|
elsif @default_table
|
167
168
|
colset_key, col_key = @default_table, colset_key
|
168
169
|
else
|
169
|
-
|
170
|
+
EzLog.error "ColumnSetCollection.get: illegal arguments: #{colset_key}, #{col_key}"
|
170
171
|
return nil
|
171
172
|
end
|
172
173
|
end
|
173
174
|
colset = @colset_h[colset_key.to_sym]
|
174
175
|
return nil unless colset
|
175
|
-
#
|
176
|
+
# EzLog.debug("Collection.get: colset_key=#{colset_key}, col_key=#{col_key}, value=#{colset[col_key].value}")
|
176
177
|
return colset[col_key]
|
177
178
|
end
|
178
179
|
|
@@ -182,7 +183,7 @@ module Ezframe
|
|
182
183
|
end
|
183
184
|
|
184
185
|
class ColumnSet
|
185
|
-
attr_accessor :name, :parent, :edit_keys, :view_keys
|
186
|
+
attr_accessor :name, :parent # , :edit_keys, :view_keys
|
186
187
|
|
187
188
|
def initialize(parent: nil, name: nil, columns: nil)
|
188
189
|
@parent = parent
|
@@ -201,6 +202,14 @@ module Ezframe
|
|
201
202
|
@columns.keys
|
202
203
|
end
|
203
204
|
|
205
|
+
def edit_keys
|
206
|
+
@columns.keys.select {|k| !@columns[k].no_edit? }
|
207
|
+
end
|
208
|
+
|
209
|
+
def view_keys
|
210
|
+
@columns.keys.select {|k| !@columns[k].no_view? }
|
211
|
+
end
|
212
|
+
|
204
213
|
# 配列を初期化する
|
205
214
|
def set(attr_a)
|
206
215
|
@columns[:id] = IdType.new(key: "id", label: "ID", hidden: true)
|
@@ -217,6 +226,7 @@ module Ezframe
|
|
217
226
|
end
|
218
227
|
@columns[:created_at] = DatetimeType.new(type: "datetime", key: "created_at", label: "生成日時", hidden: true)
|
219
228
|
@columns[:updated_at] = DatetimeType.new(type: "datetime", key: "updated_at", label: "更新日時", hidden: true)
|
229
|
+
@columns[:deleted_at] = DatetimeType.new(type: "datetime", key: "deleted_at", label: "削除日時", hidden: true)
|
220
230
|
@columns.values.each { |col| col.parent = self }
|
221
231
|
return @columns
|
222
232
|
end
|
@@ -228,18 +238,27 @@ module Ezframe
|
|
228
238
|
def set_from_db(id)
|
229
239
|
data = dataset.where(id: id).first
|
230
240
|
return nil unless data
|
231
|
-
self.
|
241
|
+
self.set_values(data, from_db: true)
|
232
242
|
return data
|
233
243
|
end
|
234
244
|
|
245
|
+
def set_from_form(form, key_suffix: nil)
|
246
|
+
self.set_values(form)
|
247
|
+
end
|
248
|
+
|
235
249
|
# データベースに新規に値を登録する
|
236
|
-
def create(value_h)
|
237
|
-
|
250
|
+
def create(value_h, from_db: nil, key_suffix: nil)
|
251
|
+
if from_db
|
252
|
+
self.set_values(value_h, from_db: true, key_suffix: key_suffix)
|
253
|
+
else
|
254
|
+
self.set_values(value_h, key_suffix: key_suffix)
|
255
|
+
end
|
238
256
|
db_value_h = self.get_hash(:db_value)
|
239
|
-
|
257
|
+
EzLog.debug("column_set.create: #{db_value_h}")
|
240
258
|
db_value_h.delete(:id)
|
241
259
|
db_value_h[:updated_at] = Time.now
|
242
260
|
db_value_h[:created_at] = Time.now
|
261
|
+
EzLog.debug("create: sql=#{dataset.insert_sql(db_value_h)}")
|
243
262
|
return dataset.insert(db_value_h)
|
244
263
|
end
|
245
264
|
|
@@ -249,50 +268,57 @@ module Ezframe
|
|
249
268
|
updated_values = {}
|
250
269
|
@columns.each do |colkey, column|
|
251
270
|
next if column.no_edit?
|
252
|
-
if column.
|
271
|
+
if column.respond_to?(:form_to_value)
|
253
272
|
new_value = column.form_to_value(value_h)
|
254
273
|
else
|
255
274
|
new_value = value_h[colkey]
|
256
275
|
end
|
257
|
-
prev_value = column.
|
276
|
+
prev_value = column.db_value
|
258
277
|
column.value = new_value
|
278
|
+
# EzLog.debug("key=#{colkey}, pre_value=#{prev_value}, new_value=#{column.db_value}")
|
259
279
|
if column.respond_to?("value_equal?")
|
260
|
-
unless column.value_equal?(prev_value, column.
|
261
|
-
updated_values[colkey] = column.
|
280
|
+
unless column.value_equal?(prev_value, column.db_value)
|
281
|
+
updated_values[colkey] = column.db_value
|
262
282
|
end
|
263
|
-
elsif prev_value != column.
|
264
|
-
updated_values[colkey] = column.
|
283
|
+
elsif prev_value != column.db_value
|
284
|
+
updated_values[colkey] = column.db_value
|
265
285
|
end
|
266
286
|
end
|
267
287
|
if updated_values.length > 0
|
268
288
|
updated_values[:updated_at] = Time.now
|
269
|
-
|
289
|
+
sql = dataset.where(id: id).update_sql(updated_values)
|
290
|
+
EzLog.debug("update: sql=#{sql}")
|
270
291
|
dataset.where(id: id).update(updated_values)
|
271
292
|
end
|
272
293
|
end
|
273
294
|
|
274
|
-
|
275
|
-
|
276
|
-
|
295
|
+
# 各カラムに値を格納する
|
296
|
+
def set_values(value_h, from_db: nil, key_suffix: nil)
|
297
|
+
self.clear
|
298
|
+
merge_values(value_h, from_db: from_db, key_suffix: key_suffix)
|
277
299
|
end
|
278
300
|
|
279
|
-
|
280
|
-
|
281
|
-
return unless value_h
|
301
|
+
def merge_values(value_h, from_db: nil, key_suffix: nil)
|
302
|
+
return self unless value_h
|
282
303
|
@columns.keys.each do |key|
|
283
|
-
next if key.
|
304
|
+
next if key.to_s.empty?
|
305
|
+
target_key = key
|
306
|
+
target_key = "#{key}#{key_suffix}" if key_suffix
|
284
307
|
column = @columns[key.to_sym]
|
285
|
-
|
286
|
-
|
287
|
-
val = column.form_to_value(value_h)
|
308
|
+
if !from_db && column.respond_to?(:form_to_value) # && !value_h.has_key?(key)
|
309
|
+
val = column.form_to_value(value_h, target_key: target_key)
|
288
310
|
else
|
289
|
-
val = value_h[key]
|
311
|
+
val = value_h[target_key.to_sym] || value_h[key]
|
290
312
|
end
|
291
313
|
column.value = val
|
292
314
|
end
|
293
315
|
return self
|
294
316
|
end
|
295
317
|
|
318
|
+
def values=(value_h)
|
319
|
+
set_values(value_h)
|
320
|
+
end
|
321
|
+
|
296
322
|
# 各カラムのバリデーション
|
297
323
|
# 戻り値は[ 正規化した値, エラーシンボル(Messageのキーと紐づく) ]を値として、
|
298
324
|
# カラムキーをキーとするハッシュ
|
@@ -354,7 +380,7 @@ module Ezframe
|
|
354
380
|
return @edit_keys.map do |key|
|
355
381
|
col = @columns[key.to_sym]
|
356
382
|
unless col
|
357
|
-
|
383
|
+
EzLog.info "[ERROR] @edit_keys has unknown column:name=#{@name}:key=#{key}"
|
358
384
|
next
|
359
385
|
end
|
360
386
|
col.form
|
@@ -369,7 +395,7 @@ module Ezframe
|
|
369
395
|
return @view_keys.map do |key|
|
370
396
|
col = @columns[key.to_sym]
|
371
397
|
unless col
|
372
|
-
|
398
|
+
EzLog.info "[ERROR] @view_keys has unknown column:name=#{@name}:key=#{key}"
|
373
399
|
next
|
374
400
|
end
|
375
401
|
col.view
|