diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-12-17 16:56:40 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-12-17 19:26:32 +0200 |
commit | 920d8fa4c980e7e4e0e237fbaa2b9b18b07593be (patch) | |
tree | 80f9b4b47604c6d8569aa3185133ba7cf4ef3a71 /acf2/model | |
parent | 96d70925489885912caecf59fbd3c6b9c25a4b49 (diff) | |
download | acf2-920d8fa4c980e7e4e0e237fbaa2b9b18b07593be.tar.bz2 acf2-920d8fa4c980e7e4e0e237fbaa2b9b18b07593be.tar.xz |
model: prevent deletion of specific model instances
Diffstat (limited to 'acf2/model')
-rw-r--r-- | acf2/model/model.lua | 9 | ||||
-rw-r--r-- | acf2/model/node.lua | 10 |
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 |