From 4ca6f02af21d968e7da2018515f41cee4e4efd3f Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Thu, 28 Aug 2008 19:31:25 +0000 Subject: [PATCH] CBI-UVL Validation Integration part #1 --- i18n/english/luasrc/i18n/cbi.en.lua | 3 + i18n/english/luasrc/i18n/cbi.en.xml | 3 + i18n/german/luasrc/i18n/cbi.de.lua | 3 + i18n/german/luasrc/i18n/cbi.de.xml | 3 + libs/cbi/luasrc/cbi.lua | 86 ++++++++++++++----- libs/cbi/luasrc/view/cbi/cell_valuefooter.htm | 2 + libs/cbi/luasrc/view/cbi/full_valuefooter.htm | 2 + libs/cbi/luasrc/view/cbi/tblsection.htm | 13 +++ libs/cbi/luasrc/view/cbi/ucisection.htm | 7 ++ 9 files changed, 99 insertions(+), 23 deletions(-) diff --git a/i18n/english/luasrc/i18n/cbi.en.lua b/i18n/english/luasrc/i18n/cbi.en.lua index 1bba2518c..6b1168e2e 100644 --- a/i18n/english/luasrc/i18n/cbi.en.lua +++ b/i18n/english/luasrc/i18n/cbi.en.lua @@ -1,7 +1,10 @@ cbi_add = [[Add entry]] cbi_del = [[Remove entry]] cbi_invalid = [[Error: Invalid input value]] +cbi_invalid_section = [[Error: Validation failed]] cbi_missing = [[Error: This field is mandatory]] +cbi_deperror = [[Error: At least one mandatory field has no or an invalid value]] +cbi_reqerror = [[Error: A requirement for this option was not met]] cbi_addopt = [[-- Additional Field --]] cbi_optional = [[ (optional)]] cbi_sectempty = [[This section contains no values yet]] diff --git a/i18n/english/luasrc/i18n/cbi.en.xml b/i18n/english/luasrc/i18n/cbi.en.xml index 8e6681079..35599d87e 100644 --- a/i18n/english/luasrc/i18n/cbi.en.xml +++ b/i18n/english/luasrc/i18n/cbi.en.xml @@ -5,7 +5,10 @@ Add entry Remove entry Error: Invalid input value +Error: Validation failed Error: This field is mandatory +Error: At least one mandatory field has no or an invalid value +Error: A requirement for this option was not met -- Additional Field -- (optional) This section contains no values yet diff --git a/i18n/german/luasrc/i18n/cbi.de.lua b/i18n/german/luasrc/i18n/cbi.de.lua index c59536f3f..075ed834a 100644 --- a/i18n/german/luasrc/i18n/cbi.de.lua +++ b/i18n/german/luasrc/i18n/cbi.de.lua @@ -1,7 +1,10 @@ cbi_add = [[Eintrag hinzufügen]] cbi_del = [[Eintrag entfernen]] cbi_invalid = [[Fehler: Ungültige Eingabe]] +cbi_invalid_section = [[Fehler: Validierung fehlgeschlagen]] cbi_missing = [[Fehler: Dieses Feld muss ausgefüllt werden]] +cbi_deperror = [[Fehler: Mindestens ein benötigtes Feld ist leer oder hat einen ungültigen Wert]] +cbi_reqerror = [[Fehler: Nicht erfüllte Abhängigkeit für dieses Feld]] cbi_addopt = [[-- Zusätzliches Feld --]] cbi_sectempty = [[Diese Sektion enthält noch keine Einträge]] cbi_manual = [[-- benutzerdefiniert --]] diff --git a/i18n/german/luasrc/i18n/cbi.de.xml b/i18n/german/luasrc/i18n/cbi.de.xml index b88f6b8f8..e1ecd2df6 100644 --- a/i18n/german/luasrc/i18n/cbi.de.xml +++ b/i18n/german/luasrc/i18n/cbi.de.xml @@ -5,7 +5,10 @@ Eintrag hinzufügen Eintrag entfernen Fehler: Ungültige Eingabe +Fehler: Validierung fehlgeschlagen Fehler: Dieses Feld muss ausgefüllt werden +Fehler: Mindestens ein benötigtes Feld ist leer oder hat einen ungültigen Wert +Fehler: Nicht erfüllte Abhängigkeit für dieses Feld -- Zusätzliches Feld -- Diese Sektion enthält noch keine Einträge -- benutzerdefiniert -- diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 411aa2387..543c895af 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -175,12 +175,14 @@ function Map.__init__(self, config, ...) self.parsechain = {self.config} self.template = "cbi/map" self.uci = uci.cursor() + self.save = true if not self.uci:load(self.config) then error("Unable to read UCI data: " .. self.config) end self.validator = luci.uvl.UVL() self.scheme = self.validator:get_scheme(self.config) + end function Map.get_scheme(self, sectiontype, option) @@ -202,24 +204,26 @@ end function Map.parse(self, ...) Node.parse(self, ...) - for i, config in ipairs(self.parsechain) do - self.uci:save(config) - end - if luci.http.formvalue("cbi.apply") then + if self.save then for i, config in ipairs(self.parsechain) do - self.uci:commit(config) - self.uci:apply(config) - - -- Refresh data because commit changes section names - self.uci:load(config) + self.uci:save(config) + end + if luci.http.formvalue("cbi.apply") then + for i, config in ipairs(self.parsechain) do + self.uci:commit(config) + self.uci:apply(config) + + -- Refresh data because commit changes section names + self.uci:load(config) + end + + -- Reparse sections + Node.parse(self, ...) + + end + for i, config in ipairs(self.parsechain) do + self.uci:unload(config) end - - -- Reparse sections - Node.parse(self, ...) - - end - for i, config in ipairs(self.parsechain) do - self.uci:unload(config) end end @@ -385,6 +389,10 @@ function AbstractSection.__init__(self, map, sectiontype, ...) self.config = map.config self.optionals = {} self.defaults = {} + self.fields = {} + self.tag_error = {} + self.tag_invalid = {} + self.tag_deperror = {} self.optional = true self.addremove = false @@ -413,6 +421,7 @@ function AbstractSection.option(self, class, option, ...) Node._i18n(obj, self.config, self.section or self.sectiontype, option, ...) self:append(obj) + self.fields[option] = obj return obj elseif class == true then error("No valid class was given and autodetection failed.") @@ -576,7 +585,7 @@ NamedSection = class(AbstractSection) function NamedSection.__init__(self, map, section, stype, ...) AbstractSection.__init__(self, map, stype, ...) Node._i18n(self, map.config, section, nil, ...) - + -- Defaults self.addremove = false @@ -597,7 +606,6 @@ function NamedSection.parse(self) local s = self.section local active = self:cfgvalue(s) - if self.addremove then local path = self.config.."."..s if active then -- Remove the section @@ -620,8 +628,23 @@ function NamedSection.parse(self) if not self.override_scheme and self.map.scheme then local co = self.map:get() local stat, err = self.map.validator:validate_section(self.config, s, co) - luci.http.prepare_content("text/html") - luci.util.dumptable(err) + if err then + self.map.save = false + if err.code == luci.uvl.errors.ERR_DEPENDENCY then + self.tag_deperror[s] = true + else + self.tag_invalid[s] = true + end + for i, v in ipairs(err.childs) do + if v.option and self.fields[v.option] then + if v.code == luci.uvl.errors.ERR_DEPENDENCY then + self.fields[v.option].tag_reqerror[s] = true + elseif v.code == luci.uvl.errors.ERR_OPTION then + self.fields[v.option].tag_invalid[s] = true + end + end + end + end end end AbstractSection.parse_optionals(self, s) @@ -719,9 +742,25 @@ function TypedSection.parse(self) Node.parse(self, k) if not self.override_scheme and self.map.scheme then - co = co or self.map:get() - local stat, err = self.map.uvl:validate_section(self.config, k, co) - luci.util.perror(err) + local co = self.map:get() + local stat, err = self.map.validator:validate_section(self.config, k, co) + if err then + self.map.save = false + if err.code == luci.uvl.errors.ERR_DEPENDENCY then + self.tag_deperror[k] = true + else + self.tag_invalid[k] = true + end + for i, v in ipairs(err.childs) do + if v.option and self.fields[v.option] then + if v.code == luci.uvl.errors.ERR_DEPENDENCY then + self.fields[v.option].tag_reqerror[k] = true + elseif v.code == luci.uvl.errors.ERR_OPTION then + self.fields[v.option].tag_invalid[k] = true + end + end + end + end end end AbstractSection.parse_optionals(self, k) @@ -780,6 +819,7 @@ function AbstractValue.__init__(self, map, section, option, ...) self.config = map.config self.tag_invalid = {} self.tag_missing = {} + self.tag_reqerror = {} self.tag_error = {} self.deps = {} self.cast = "string" diff --git a/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm b/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm index 7d1ac4ee6..6ca530657 100644 --- a/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm +++ b/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm @@ -15,6 +15,8 @@ $Id$ <% if self.tag_error[section] then -%>
<%=self.tag_error[section]%>
+ <%- elseif self.tag_reqerror[section] then -%> +
<%:cbi_reqerror%>
<%- elseif self.tag_invalid[section] then -%>
<%:cbi_invalid%>
<%- elseif self.tag_missing[section] then -%> diff --git a/libs/cbi/luasrc/view/cbi/full_valuefooter.htm b/libs/cbi/luasrc/view/cbi/full_valuefooter.htm index a01f6bd6c..8003f53fe 100644 --- a/libs/cbi/luasrc/view/cbi/full_valuefooter.htm +++ b/libs/cbi/luasrc/view/cbi/full_valuefooter.htm @@ -28,6 +28,8 @@ $Id$ <% if self.tag_error[section] then -%>
<%=self.tag_error[section]%>
+ <%- elseif self.tag_reqerror[section] then -%> +
<%:cbi_reqerror%>
<%- elseif self.tag_invalid[section] then -%>
<%:cbi_invalid%>
<%- elseif self.tag_missing[section] then -%> diff --git a/libs/cbi/luasrc/view/cbi/tblsection.htm b/libs/cbi/luasrc/view/cbi/tblsection.htm index 6ed078026..a557c584f 100644 --- a/libs/cbi/luasrc/view/cbi/tblsection.htm +++ b/libs/cbi/luasrc/view/cbi/tblsection.htm @@ -89,6 +89,19 @@ end <%- end -%> + <% if self.tag_deperror[section] or self.tag_invalid[section] or self.tag_error[section] then %> + + + <%- if self.tag_deperror[section] then -%> +
<%:cbi_deperror%>
+ <%- elseif self.tag_invalid[section] then -%> +
<%:cbi_invalid_section%>
+ <%- elseif self.tag_error[section] then -%> +
<%=self.tag_error[section]%>
+ <%- end -%> + + + <% end %> <%- end -%> <%- if isempty then -%> diff --git a/libs/cbi/luasrc/view/cbi/ucisection.htm b/libs/cbi/luasrc/view/cbi/ucisection.htm index 1d318f791..c245940d4 100644 --- a/libs/cbi/luasrc/view/cbi/ucisection.htm +++ b/libs/cbi/luasrc/view/cbi/ucisection.htm @@ -16,6 +16,13 @@ $Id$ <% self:render_children(section, scope or {}) %> <% if #self.optionals[section] > 0 or self.dynamic then %> + <% if self.tag_deperror[section] then -%> +
<%:cbi_deperror%>
+ <% elseif self.tag_invalid[section] then -%> +
<%:cbi_invalid_section%>
+ <%- elseif self.tag_error[section] then -%> +
<%=self.tag_error[section]%>
+ <%- end %>
<% if self.dynamic then %> -- 2.25.1