summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-21 23:15:31 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-21 23:19:12 +0200
commitf51a778e350f2528566fbdd68fc47d6abcf8126b (patch)
tree1b6c76dd363cf2f5a284ff331f1ea7c218f745d7
parent9763ae2ed9d352c95cf6313ea5167f8414d77337 (diff)
downloadacf2-f51a778e350f2528566fbdd68fc47d6abcf8126b.tar.bz2
acf2-f51a778e350f2528566fbdd68fc47d6abcf8126b.tar.xz
model: cascade deletion action for references
-rw-r--r--acf2/model/init.lua20
-rw-r--r--acf2/model/node.lua1
2 files changed, 16 insertions, 5 deletions
diff --git a/acf2/model/init.lua b/acf2/model/init.lua
index 6a519fa..404bfa0 100644
--- a/acf2/model/init.lua
+++ b/acf2/model/init.lua
@@ -68,11 +68,13 @@ local stringy = require('stringy')
M.Reference = class(Field)
function M.Reference:init(params)
- if not params.widget then params.widget = 'reference' end
- super(self, M.Reference):init(params)
+ super(self, M.Reference):init(
+ util.setdefaults(
+ params, {on_delete='restrict', scope='/', widget='reference'}
+ )
+ )
self.dtype = 'reference'
self.dereference = true
- if not self.scope then self.scope = '/' end
self.filter = fld.conv_filter(self.filter)
end
@@ -169,9 +171,17 @@ end
function M.Reference:deleted(context, addr)
local target = self:load(context, {dereference=true})
+
if target and node.addr(target) == addr then
- -- TODO raise error for the target object
- raise(context.path, 'Refers to '..addr)
+ local policy = self.on_delete
+
+ if policy == 'restrict' then
+ -- TODO raise error for the target object
+ raise(context.path, 'Refers to '..addr)
+ end
+
+ assert(policy == 'cascade')
+ node.save(context.parent, M.path.name(context.path))
end
end
diff --git a/acf2/model/node.lua b/acf2/model/node.lua
index bebad93..d9d095d 100644
--- a/acf2/model/node.lua
+++ b/acf2/model/node.lua
@@ -333,6 +333,7 @@ for _, mf in ipairs{
'name',
'parent',
'path',
+ 'save',
'topology'
} do M[mf] = meta_func(mf) end