blob: 1f6911854574b4268b386c67be7b3e27d26a3909 [file]
import marshmallow as ma
from app.utility.base_object import BaseObject
from app.objects.secondclass.c_fact import Fact, FactSchema
class RelationshipSchema(ma.Schema):
unique = ma.fields.String(dump_only=True)
source = ma.fields.Nested(FactSchema, required=True)
edge = ma.fields.String(allow_none=True)
target = ma.fields.Nested(FactSchema, allow_none=True)
score = ma.fields.Integer()
origin = ma.fields.String(allow_none=True)
@ma.pre_load
def remove_unique(self, data, **_):
data.pop('unique', None)
return data
@ma.post_load
def build_relationship(self, data, **kwargs):
return None if kwargs.get('partial') is True else Relationship(**data)
class RelationshipUpdateSchema(ma.Schema):
criteria = ma.fields.Nested(RelationshipSchema(partial=True), required=True)
updates = ma.fields.Nested(RelationshipSchema(partial=True), required=True)
class Relationship(BaseObject):
schema = RelationshipSchema()
load_schema = RelationshipSchema(exclude=['unique'])
@property
def unique(self):
return '%s%s%s' % (self.source, self.edge, self.target)
@classmethod
def from_json(cls, json):
return cls(source=json['source'], edge=json.get('edge'), target=json.get('target'), score=json.get('score'))
@property
def display(self):
return self.clean(dict(source=self.source, edge=self.edge,
target=[self.target if self.target else 'Not Used'][0], score=self.score))
@property
def flat_display(self):
temp = self.display
temp['source'] = temp['source'].display
if self.target:
temp['target'] = temp['target'].display
if self.origin:
temp['origin'] = self.origin
return temp
@property
def shorthand(self):
# compute a visual representation of a relationship for recording purposes
stub = f"{self.source.name}({self.source.value})"
if self.edge:
stub += f" : {self.edge}"
if self.target and self.target.name:
stub += f" : {self.target.name}({self.target.value})"
return stub
def __init__(self, source, edge=None, target=None, score=1, origin=None):
super().__init__()
self.source = source or Fact('', None)
self.edge = edge
self.target = target or Fact('', None)
self.score = score
self.origin = origin