module("luci.cbi", package.seeall)
require("luci.template")
-require("luci.util")
+local util = require("luci.util")
require("luci.http")
require("luci.uvl")
require("luci.fs")
--local event = require "luci.sys.event"
local uci = require("luci.model.uci")
-local class = luci.util.class
-local instanceof = luci.util.instanceof
+local class = util.class
+local instanceof = util.instanceof
FORM_NODATA = 0
FORM_PROCEED = 0
local upldir = "/lib/uci/upload/"
local cbidir = luci.util.libpath() .. "/model/cbi/"
-
- assert(luci.fs.stat(cbimap) or luci.fs.stat(cbidir..cbimap..".lua"),
+
+ assert(luci.fs.stat(cbimap) or luci.fs.stat(cbidir..cbimap..".lua"),
"Model not found!")
-
+
local func, err = loadfile(cbimap)
if not func then
func, err = loadfile(cbidir..cbimap..".lua")
self.uci = uci.cursor()
self.save = true
-
+
self.changed = false
-
+
if not self.uci:load(self.config) then
error("Unable to read UCI data: " .. self.config)
end
function Compound.parse(self, ...)
local cstate, state = 0, 0
-
+
for k, child in ipairs(self.children) do
cstate = child:parse(...)
state = (not state or cstate < state) and cstate or state
end
-
+
return state
end
function Delegator.state(self, name, node, transitor)
transitor = transitor or self.transistor_linear
local state = {node=node, name=name, transitor=transitor}
-
+
assert(instanceof(node, Node), "Invalid node")
assert(not self.nodes[name], "Duplicate entry")
-
+
self.nodes[name] = state
self:append(state)
-
+
return state
end
function Delegator.parse(self, ...)
local active = self:getactive()
assert(active, "Invalid state")
-
+
local cstate = active.node:parse()
self.active = active.transistor(self, active.node, cstate)
-
+
if not self.active then
return FORM_DONE
else
end
function Delegator.getactive(self)
- return self:get(Map.formvalue(self, "cbi.delegated")
- or (self.children[1] and self.children[1].name))
+ return self:get(Map.formvalue(self, "cbi.delegated")
+ or (self.children[1] and self.children[1].name))
end
--[[
-- Removes the section
function AbstractSection.remove(self, section)
+ self.map.autoapply = false
return self.map:del(section)
end
end
end
+ self.map.autoapply = false
+
return stat
end
local datasource = {}
datasource.config = "table"
self.data = data
-
+
datasource.formvalue = Map.formvalue
datasource.formvaluetable = Map.formvaluetable
datasource.readinput = true
function datasource.get(self, section, option)
return data[section] and data[section][option]
end
-
+
function datasource.submitstate(self)
return Map.formvalue(self, "cbi.submit")
end
end
end
AbstractSection.parse_optionals(self, s)
-
+
if self.changed then
self:push_events()
end
for i, k in ipairs(self:cfgsections()) do
AbstractSection.parse_dynamic(self, k)
if self.map:submitstate() then
- Node.parse(self, k)
+ Node.parse(self, k, novld)
if not novld and not self.override_scheme and self.map.scheme then
_uvl_validate_section(self, k)
--self.cast = "string"
self.track_missing = false
- --self.rmempty = false
+ self.rmempty = true
self.default = nil
self.size = nil
self.optional = false
if not self.override_scheme
and self.map:get_scheme(self.section.sectiontype, self.option) then
local vs = self.map:get_scheme(self.section.sectiontype, self.option)
- if self.rmempty == nil then
- self.rmempty = not vs.required
- end
if self.cast == nil then
self.cast = (vs.type == "list") and "list" or "string"
end
self.rmempty = not value
end
-function AbstractValue.parse(self, section)
+function AbstractValue.parse(self, section, novld)
local fvalue = self:formvalue(section)
local cvalue = self:cfgvalue(section)
if fvalue and #fvalue > 0 then -- If we have a form value, write it to UCI
fvalue = self:transform(self:validate(fvalue, section))
- if not fvalue then
+ if not fvalue and not novld then
if self.error then
self.error[section] = "invalid"
else
if self:write(section, fvalue) then
-- Push events
self.section.changed = true
- --luci.util.append(self.map.events, self.events)
+ --luci.util.append(self.map.events, self.events)
end
end
else -- Unset the UCI or error
self.section.changed = true
--luci.util.append(self.map.events, self.events)
end
- elseif cvalue ~= fvalue then
- self:write(section, fvalue)
+ elseif cvalue ~= fvalue and not novld then
+ self:write(section, fvalue or "")
if self.error then
self.error[section] = "missing"
else
local valid = {}
for i, v in ipairs(value) do
- if luci.util.contains(self.vallist, v) then
+ if luci.util.contains(self.keylist, v) then
table.insert(valid, v)
end
end