handle relation attributes in child relation set
This commit is contained in:
parent
068c555903
commit
8a4f612c77
2 changed files with 31 additions and 10 deletions
37
common.py
37
common.py
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
|
# Copyright (c) 2013 Helmut Merz helmutm@cy55.de
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -366,7 +366,7 @@ class RelationSet(object):
|
||||||
|
|
||||||
class ParentRelationSet(RelationSet):
|
class ParentRelationSet(RelationSet):
|
||||||
|
|
||||||
def add(self, related, order=0, relevance=1.0):
|
def add(self, related, order=0, relevance=1.0, attrs={}):
|
||||||
related = baseObject(related)
|
related = baseObject(related)
|
||||||
self.context.deassignParent(related, [self.predicate], # avoid duplicates
|
self.context.deassignParent(related, [self.predicate], # avoid duplicates
|
||||||
noSecurityCheck=self.noSecurityCheck)
|
noSecurityCheck=self.noSecurityCheck)
|
||||||
|
@ -401,10 +401,17 @@ class ParentRelationSet(RelationSet):
|
||||||
|
|
||||||
class ChildRelationSet(RelationSet):
|
class ChildRelationSet(RelationSet):
|
||||||
|
|
||||||
def add(self, related, order=0, relevance=1.0):
|
def add(self, related, order=0, relevance=1.0, **attrs):
|
||||||
related = baseObject(related)
|
related = baseObject(related)
|
||||||
self.context.deassignChild(related, [self.predicate]) # avoid duplicates
|
if not attrs: # no duplicates when relation has no attributes
|
||||||
self.context.assignChild(related, self.predicate, order, relevance)
|
self.context.deassignChild(related, [self.predicate])
|
||||||
|
rel = self.context.createChildRelation(
|
||||||
|
related, self.predicate, order, relevance)
|
||||||
|
if attrs:
|
||||||
|
from loops.predicate import adaptedRelation
|
||||||
|
adrel = adaptedRelation(rel)
|
||||||
|
for k, v in attrs.items():
|
||||||
|
setattr(adrel, k, v)
|
||||||
|
|
||||||
def remove(self, related):
|
def remove(self, related):
|
||||||
related = baseObject(related)
|
related = baseObject(related)
|
||||||
|
@ -458,15 +465,25 @@ class RelationSetProperty(object):
|
||||||
noSecurityCheck=self.noSecurityCheck)
|
noSecurityCheck=self.noSecurityCheck)
|
||||||
|
|
||||||
def __set__(self, inst, value):
|
def __set__(self, inst, value):
|
||||||
value = [baseObject(c) for c in value]
|
objects = []
|
||||||
|
attrs = []
|
||||||
|
hasAttrs = False
|
||||||
|
for c in value:
|
||||||
|
if isinstance(c, dict):
|
||||||
|
objects.append(baseObject(c.pop('object')))
|
||||||
|
attrs.append(c)
|
||||||
|
hasAttrs = True
|
||||||
|
else:
|
||||||
|
objects.append(baseObject(c))
|
||||||
|
attrs.append({})
|
||||||
rs = self.factory(inst, self.predicateName)
|
rs = self.factory(inst, self.predicateName)
|
||||||
current = [baseObject(c) for c in rs]
|
current = [baseObject(c) for c in rs]
|
||||||
for c in current:
|
for c in current:
|
||||||
if c not in value:
|
if hasAttrs or c not in objects:
|
||||||
rs.remove(c)
|
rs.remove(c)
|
||||||
for v in value:
|
for idx, v in enumerate(objects):
|
||||||
if v not in current:
|
if hasAttrs or v not in current:
|
||||||
rs.add(v)
|
rs.add(v, **attrs[idx])
|
||||||
|
|
||||||
|
|
||||||
class ParentRelationSetProperty(RelationSetProperty):
|
class ParentRelationSetProperty(RelationSetProperty):
|
||||||
|
|
|
@ -242,6 +242,9 @@ class Concept(Contained, Persistent):
|
||||||
return predicate
|
return predicate
|
||||||
|
|
||||||
def assignChild(self, concept, predicate=None, order=0, relevance=1.0):
|
def assignChild(self, concept, predicate=None, order=0, relevance=1.0):
|
||||||
|
self.createChildRelation(concept, predicate, order, relevance)
|
||||||
|
|
||||||
|
def createChildRelation(self, concept, predicate=None, order=0, relevance=1.0):
|
||||||
predicate = self.checkPredicate(concept, predicate)
|
predicate = self.checkPredicate(concept, predicate)
|
||||||
registry = component.getUtility(IRelationRegistry)
|
registry = component.getUtility(IRelationRegistry)
|
||||||
rel = ConceptRelation(self, concept, predicate)
|
rel = ConceptRelation(self, concept, predicate)
|
||||||
|
@ -252,6 +255,7 @@ class Concept(Contained, Persistent):
|
||||||
# TODO (?): avoid duplicates
|
# TODO (?): avoid duplicates
|
||||||
registry.register(rel)
|
registry.register(rel)
|
||||||
notify(AssignmentEvent(self, rel))
|
notify(AssignmentEvent(self, rel))
|
||||||
|
return rel
|
||||||
|
|
||||||
def setChildren(self, predicate, concepts):
|
def setChildren(self, predicate, concepts):
|
||||||
existing = self.getChildren([predicate])
|
existing = self.getChildren([predicate])
|
||||||
|
|
Loading…
Add table
Reference in a new issue