summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-17 16:56:40 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-17 19:26:32 +0200
commit920d8fa4c980e7e4e0e237fbaa2b9b18b07593be (patch)
tree80f9b4b47604c6d8569aa3185133ba7cf4ef3a71
parent96d70925489885912caecf59fbd3c6b9c25a4b49 (diff)
downloadaconf-920d8fa4c980e7e4e0e237fbaa2b9b18b07593be.tar.bz2
aconf-920d8fa4c980e7e4e0e237fbaa2b9b18b07593be.tar.xz
model: prevent deletion of specific model instances
-rw-r--r--acf2/model/model.lua9
-rw-r--r--acf2/model/node.lua10
2 files changed, 18 insertions, 1 deletions
diff --git a/acf2/model/model.lua b/acf2/model/model.lua
index 4140087..fdb7c96 100644
--- a/acf2/model/model.lua
+++ b/acf2/model/model.lua
@@ -168,12 +168,19 @@ function M.Model:init(context)
return v
end
+ if self.is_removable then
+ function mt.removable() return self:is_removable() end
+ end
+
if not mt.txn then return end
function mt.mmeta(name) return mt.member(name):meta() end
- function mt.save(k, v) return mt.member(k, false, Field):save(v) end
+ function mt.save(k, v)
+ mt.check_removable(k, v)
+ return mt.member(k, false, Field):save(v)
+ end
local function tmeta(tpe)
return map(function(m) return m:meta() end, _members(tpe))
diff --git a/acf2/model/node.lua b/acf2/model/node.lua
index 86722f2..02eb12f 100644
--- a/acf2/model/node.lua
+++ b/acf2/model/node.lua
@@ -62,6 +62,15 @@ function M.TreeNode:init(context)
mt.__eq = equal_tns
mt._meta = {}
function mt.get(k, options) return mt.load(k, options) end
+ function mt.removable() return true end
+
+ function mt.check_removable(k, v)
+ if v ~= nil then return end
+ local old = mt.load(k, {dereference=false})
+ if isinstance(old, M.TreeNode) and not getmetatable(old).removable() then
+ raise(pth.join(mt.path, k), 'Cannot be deleted')
+ end
+ end
if not mt.txn then return end
@@ -209,6 +218,7 @@ function M.Collection:init(context, params)
if not params.editable then
raise(mt.path, 'Collection is not editable')
end
+ mt.check_removable(k, v)
mt.member(k):save(v)
end
end