-- the interfaces controller module (..., package.seeall) -- Cause an http redirect to our "read" action -- We use the self.conf table because it already has prefix,controller,etc -- The redir code is defined in the application error handler (acf-controller) local list_redir = function (self) self.conf.action = "read" self.conf.type = "redir" error (self.conf) end local pvt = {} mvc= {} mvc.on_load = function(self, parent) -- If they try to run a bogus action, send them to read if ( rawget(self.worker, self.conf.action) == nil ) then list_redir(self) end pvt.parent_on_exec = parent.worker.mvc.post_exec --logit ("interfaces controller on_load has finished") end mvc.pre_exec = function (self) --logit ("interfaces-controller pre_exec activated") -- pvt.parent_on_exec () end mvc.post_exec = function ( self ) --logit ("interfaces-controller post_exec activated") return pvt.parent_on_exec() end read = function (self ) local iface = self.model.get_all_interfaces() -- these actions are available for each interface -- **FIXME** This is technically wrong. The controller should pass -- the "script" "prefix" "controller" "action" as separate fields, -- since the view could be a cli, not a web interface. the VIEW -- should make a uri from these these elements. local actions = { link = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller .. "/", action = { "create", "read", "update", "delete" } } return ( { actions = actions, iface = iface } ) end -- Accepts form info -- Returns a cfe object (the form) update = function(self) local iface = self.clientdata.iface or "" local result local data -- If interface is not found, return to list result, data = self.model.get_iface_by_name ( iface ) if result == false then list_redir(self) end -- If the "cmd" button was used, then attempt to do the update if self.clientdata.cmd then -- update the iface info the form gave us for k,v in pairs (data) do if self.clientdata[k] then data[k].value = self.clientdata[k] end end result, data = self.model.update_iface_by_name ( data, data.name.value ) -- If validation worked then return to list if result == true then list_redir(self) end end -- If we reach this point in the function, then we are providing a form -- for the user to edit (either first time in, or validation failed) -- Add a command button data.cmd = cfe({type="action", value="save", label="action"}) return ( cfe ({type="form", option={ script=ENV["SCRIPT_NAME"], prefix=self.conf.prefix, controller = self.conf.controller, action = "update", extra = "?iface=" .. data.name.value }, value = data} ) ) end delete = function(self) local iface = self.clientdata.iface or "" local result local data -- If the interface doesn't exist, return to the list now result, data = self.model.get_iface_by_name ( iface ) if result == false then list_redir(self) end -- If the cmd button was pressed, then commit the change if self.clientdata.cmd then if self.clientdata.cmd == "delete" then self.model.delete_iface_by_name (iface) end list_redir(self) end -- Otherwise, return a form local me = {} me.iface = cfe({value = self.clientdata.iface }) me.action1 = cfe({name="cmd", type="action", value="delete", label="action"}) me.action2 = cfe({name="cmd", type="action", value="cancel", label="action"}) return ( cfe ({type="form", option={ script=ENV["SCRIPT_NAME"], prefix=self.conf.prefix, controller = self.conf.controller, action = "delete", extra = "?iface=" .. (self.clientdata.iface or "") }, value = me} ) ) end create = function(self) local iface = self.clientdata.iface or "" local index = 0 local result, data = self.model.get_iface_by_name () -- If the "cmd" button was used, then attempt to do the insert if self.clientdata.cmd then for k,v in pairs (data) do if self.clientdata[k] then data[k].value = self.clientdata[k] end end result, data = self.model.create_iface_by_name ( iface, data ) if result then list_redir(self) end end -- If we reach this point in the function, we are providing a form -- Add a command button data.cmd = cfe({type="action", value="save", label="action"}) return ( cfe ({type="form", option={ script=ENV["SCRIPT_NAME"], prefix=self.conf.prefix, controller = self.conf.controller, action = "create", extra = "?iface=" .. iface or "" }, value = data} ) ) end