summaryrefslogtreecommitdiff
path: root/src/server/model
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/model')
-rw-r--r--src/server/model/__init__.py0
-rw-r--r--src/server/model/graph.py105
-rw-r--r--src/server/model/model.py37
3 files changed, 142 insertions, 0 deletions
diff --git a/src/server/model/__init__.py b/src/server/model/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/server/model/__init__.py
diff --git a/src/server/model/graph.py b/src/server/model/graph.py
new file mode 100644
index 00000000..f197921d
--- /dev/null
+++ b/src/server/model/graph.py
@@ -0,0 +1,105 @@
+class Attr_Diff(dict):
+ """
+ Represents a change to note attributes, where nodes can represent
+ either logical nodes or logical links, and attributes can be added,
+ changed or removed
+
+ Example:
+ attr_diff = {'__type_node' : {n_id: {'__attr_write': {'attr_0': 0,
+ 'attr_1': 'a'},
+ '__attr_remove': ['attr_2'] }}
+ '__type_link' : {l_id: ... }
+ }
+ """
+ def __init__(self):
+ self['__type_node'] = {}
+ self['__type_link'] = {}
+
+ def init_node_attr_diff(self, n_id):
+ ret = {'__attr_write': {},
+ '__attr_remove': []}
+ self['__type_node'][n_id] = ret
+ return ret
+
+ @staticmethod
+ def from_json_dict(json_dict):
+ ret = Attr_Diff()
+ for obj_type in ret.keys():
+ obj_ad_set = json_dict.get(obj_type)
+ if None != obj_ad_set:
+ for o_id, ad in obj_ad_set.items():
+ if None != ad.get('__attr_write'):
+ for k, v in ad['__attr_write'].items():
+ ret.add_node_attr_write(o_id, k, v)
+ if None != ad.get('__attr_remove'):
+ for k in ad['__attr_remove']:
+ ret.add_node_attr_rm(o_id, k)
+ return ret
+
+ @property
+ def type__node(self):
+ return self['__type_node']
+
+ @property
+ def type__link(self):
+ return self['__type_link']
+
+ def add_node_attr_write(self, n_id, attr_name, attr_val):
+
+ assert 'id' != attr_name.lower(), 'Attr_Diff: attempt to write to \'id\' attribute'
+
+ n_attr_diff = self['__type_node'].get(n_id)
+ if None == n_attr_diff:
+ n_attr_diff = self.init_node_attr_diff(n_id)
+ n_attr_diff['__attr_write'][attr_name] = attr_val
+
+ def add_node_attr_rm(self, n_id, attr_name):
+ n_attr_diff = self['__type_node'].get(n_id)
+ if None == n_attr_diff:
+ n_attr_diff = self.init_node_attr_diff(n_id)
+ n_attr_diff['__attr_remove'].append(attr_name)
+
+ def add_link_attr_write(self, l_id, attr_name, attr_val):
+ assert False, 'unimplemented'
+
+ def add_link_attr_rm(self, l_id, attr_name):
+ assert False, 'unimplemented'
+
+class Topo_Diff(object):
+ """
+ Represents a change to the graph topology
+ """
+ def __init__(self, link_set_rm=[],
+ node_set_rm=[],
+ node_set_add=[],
+ link_set_add=[]):
+
+ self.link_set_rm = link_set_rm
+ self.node_set_rm = node_set_rm
+ self.node_set_add = node_set_add
+ self.link_set_add = link_set_add
+
+ def __str__(self):
+ return __name__ + ': ' + ', '.join('%s: %s' % (k, v) for k, v in self.__dict__.items())
+
+ def check_validity(self, topo_diff_dict):
+ """
+ Topo_Diff may represent invalid operations, eg. adding a link while
+ removing it's end-point - this stub should check for that
+ """
+ pass
+
+ @staticmethod
+ def from_json_dict(json_dict):
+ """
+ construct from dict - no node/link constructor set must be provided
+ """
+ ret = Topo_Diff()
+
+ # merge keys - this allows constructor argument omission (link_set_rm,
+ # node_set_rm, etc.) such as when constructing from POST JSON data
+ for k, _ in ret.__dict__.items():
+ v = json_dict.get(k)
+ if None != v:
+ ret.__dict__[k] = v
+ return ret
diff --git a/src/server/model/model.py b/src/server/model/model.py
new file mode 100644
index 00000000..33cf9e6a
--- /dev/null
+++ b/src/server/model/model.py
@@ -0,0 +1,37 @@
+class Link():
+ """
+ documentation anchor - this class currently carries no implementation
+ and only acts as a documentation anchor
+
+ link['__src'] - meta attribute for link source object
+ link['__dst'] - meta attribute for link destination object
+ """
+
+ def __init__(self, src=None, dst=None):
+ assert False, 'currently unused'
+
+ class Link_Ptr(dict):
+ """
+ link['__src_id'] - meta attribute for link source id
+ link['__dst_id'] - meta attribute for link destination id
+ """
+ def __init__(self, src_id=None, dst_id=None):
+ assert None != src_id or None != dst_id
+
+ self['__src_id'] = src_id
+ self['__dst_id'] = dst_id
+
+ @property
+ def src_id(self):
+ return self['__src_id']
+
+ @property
+ def dst_id(self):
+ return self['__dst_id']
+
+ @staticmethod
+ def link_ptr(src_id=None, dst_id=None):
+ """
+ init from src_id or dst_id attributes - at least one must be provided
+ """
+ return Link.Link_Ptr(src_id, dst_id)