You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ariatosca.apache.org by mx...@apache.org on 2017/01/01 14:27:50 UTC
incubator-ariatosca git commit: wip [Forced Update!]
Repository: incubator-ariatosca
Updated Branches:
refs/heads/Relationship-ordering-significance-support d683352e8 -> f96047dd3 (forced update)
wip
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/f96047dd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/f96047dd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/f96047dd
Branch: refs/heads/Relationship-ordering-significance-support
Commit: f96047dd3445ee7fa93ce732872a2a23ed97a535
Parents: c9ecc54
Author: mxmrlv <mx...@gmail.com>
Authored: Tue Dec 27 16:42:57 2016 +0200
Committer: mxmrlv <mx...@gmail.com>
Committed: Sun Jan 1 16:24:59 2017 +0200
----------------------------------------------------------------------
aria/storage/base_model.py | 68 +++++++++++++++++++++++++++++++++--------
aria/storage/structure.py | 17 +++++++++--
2 files changed, 70 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f96047dd/aria/storage/base_model.py
----------------------------------------------------------------------
diff --git a/aria/storage/base_model.py b/aria/storage/base_model.py
index c7eb27c..454bc95 100644
--- a/aria/storage/base_model.py
+++ b/aria/storage/base_model.py
@@ -51,6 +51,7 @@ from sqlalchemy import (
Float,
orm,
)
+from sqlalchemy.ext.orderinglist import ordering_list
from .structure import ModelMixin
@@ -415,7 +416,13 @@ class RelationshipBase(ModelMixin):
"""
__tablename__ = 'relationships'
- _private_fields = ['source_node_fk', 'target_node_fk']
+ _private_fields = ['source_node_fk', 'target_node_fk', 'position']
+
+ position = Column(Integer)
+
+ @declared_attr
+ def deployment_id(self):
+ return association_proxy('source_node', 'deployment_id')
@declared_attr
def source_node_fk(cls):
@@ -423,8 +430,14 @@ class RelationshipBase(ModelMixin):
@declared_attr
def source_node(cls):
- return cls.one_to_many_relationship('source_node_fk',
- backreference='outbound_relationships')
+ return cls.one_to_many_relationship(
+ 'source_node_fk',
+ backreference='outbound_relationships',
+ backref_kwargs=dict(
+ order_by=cls.position,
+ collection_class=ordering_list('position', count_from=0)
+ )
+ )
@declared_attr
def source_name(cls):
@@ -432,11 +445,18 @@ class RelationshipBase(ModelMixin):
@declared_attr
def target_node_fk(cls):
- return cls.foreign_key(NodeBase)
+ return cls.foreign_key(NodeBase, nullable=True)
@declared_attr
def target_node(cls):
- return cls.one_to_many_relationship('target_node_fk', backreference='inbound_relationships')
+ return cls.one_to_many_relationship(
+ 'target_node_fk',
+ backreference='inbound_relationships',
+ backref_kwargs=dict(
+ order_by=cls.position,
+ collection_class=ordering_list('position', count_from=0)
+ )
+ )
@declared_attr
def target_name(cls):
@@ -503,35 +523,58 @@ class RelationshipInstanceBase(ModelMixin):
__tablename__ = 'relationship_instances'
_private_fields = ['relationship_storage_fk',
'source_node_instance_fk',
- 'target_node_instance_fk']
+ 'target_node_instance_fk',
+ 'position']
+
+ position = Column(Integer)
@declared_attr
def source_node_instance_fk(cls):
- return cls.foreign_key(NodeInstanceBase)
+ return cls.foreign_key(NodeInstanceBase, nullable=True)
@declared_attr
def source_node_instance(cls):
- return cls.one_to_many_relationship('source_node_instance_fk',
- backreference='outbound_relationship_instances')
+ return cls.one_to_many_relationship(
+ 'source_node_instance_fk',
+ backreference='outbound_relationship_instances',
+ backref_kwargs=dict(
+ order_by=cls.position,
+ collection_class=ordering_list('position', count_from=0)
+ )
+ )
@declared_attr
def source_node_instance_name(cls):
+ return association_proxy('source_node_instance', 'node_{0}'.format(cls.name_column_name()))
+
+ @declared_attr
+ def source_node_name(cls):
return association_proxy('source_node_instance', cls.name_column_name())
@declared_attr
def target_node_instance_fk(cls):
- return cls.foreign_key(NodeInstanceBase)
+ return cls.foreign_key(NodeInstanceBase, nullable=True)
@declared_attr
def target_node_instance(cls):
- return cls.one_to_many_relationship('target_node_instance_fk',
- backreference='inbound_relationship_instances')
+ return cls.one_to_many_relationship(
+ 'target_node_instance_fk',
+ backreference='inbound_relationship_instances',
+ backref_kwargs=dict(
+ order_by=cls.position,
+ collection_class=ordering_list('position', count_from=0)
+ )
+ )
@declared_attr
def target_node_instance_name(cls):
return association_proxy('target_node_instance', cls.name_column_name())
@declared_attr
+ def target_node_name(cls):
+ return association_proxy('target_node_instance', 'node_{0}'.format(cls.name_column_name()))
+
+ @declared_attr
def relationship_fk(cls):
return cls.foreign_key(RelationshipBase)
@@ -544,6 +587,7 @@ class RelationshipInstanceBase(ModelMixin):
return association_proxy('relationship', cls.name_column_name())
+
class PluginBase(ModelMixin):
"""
Plugin model representation.
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/f96047dd/aria/storage/structure.py
----------------------------------------------------------------------
diff --git a/aria/storage/structure.py b/aria/storage/structure.py
index d222c94..4b179f2 100644
--- a/aria/storage/structure.py
+++ b/aria/storage/structure.py
@@ -80,7 +80,9 @@ class ModelMixin(object):
@classmethod
def one_to_many_relationship(cls,
foreign_key_column,
- backreference=None):
+ backreference=None,
+ backref_kwargs=None,
+ **kwargs):
"""Return a one-to-many SQL relationship object
Meant to be used from inside the *child* object
@@ -89,6 +91,7 @@ class ModelMixin(object):
:param foreign_key_column: The column of the foreign key (from the child table)
:param backreference: The name to give to the reference to the child (on the parent table)
"""
+ backref_kwargs = backref_kwargs or {}
parent_table = cls._get_cls_by_tablename(
getattr(cls, foreign_key_column).__remote_table_name)
primaryjoin_str = '{parent_class_name}.{parent_unique_id} == ' \
@@ -105,7 +108,8 @@ class ModelMixin(object):
foreign_keys=[getattr(cls, foreign_key_column)],
# The following line make sure that when the *parent* is
# deleted, all its connected children are deleted as well
- backref=backref(backreference or cls.__tablename__, cascade='all'),
+ backref=backref(backreference or cls.__tablename__, cascade='all', **backref_kwargs),
+ **kwargs
)
@classmethod
@@ -142,7 +146,14 @@ class ModelMixin(object):
else:
# Can't simply call here `self.to_response()` because inheriting
# class might override it, but we always need the same code here
- res = dict((f, getattr(self, f)) for f in self.fields())
+ res = dict()
+
+ # Recursive to_dict support
+ for field in self.fields():
+ if isinstance(field, ModelMixin):
+ res[field] = field.to_dict()
+ else:
+ res[field] = getattr(self, field)
return res
@classmethod