1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15+ import logging
1516import re
1617import six
18+ import warnings
1719
1820from cassandra .cqlengine import columns
1921from cassandra .cqlengine .exceptions import ModelException , CQLEngineException , ValidationError
2224from cassandra .cqlengine .query import MultipleObjectsReturned as _MultipleObjectsReturned
2325from cassandra .util import OrderedDict
2426
27+ log = logging .getLogger (__name__ )
28+
2529
2630class ModelDefinitionException (ModelException ):
2731 pass
@@ -71,14 +75,14 @@ def __get__(self, obj, model):
7175 raise CQLEngineException ('cannot execute queries against abstract models' )
7276 queryset = model .__queryset__ (model )
7377
74- # if this is a concrete polymorphic model, and the polymorphic
78+ # if this is a concrete polymorphic model, and the discriminator
7579 # key is an indexed column, add a filter clause to only return
7680 # logical rows of the proper type
7781 if model ._is_polymorphic and not model ._is_polymorphic_base :
78- name , column = model ._polymorphic_column_name , model ._polymorphic_column
82+ name , column = model ._discriminator_column_name , model ._discriminator_column
7983 if column .partition_key or column .index :
8084 # look for existing poly types
81- return queryset .filter (** {name : model .__polymorphic_key__ })
85+ return queryset .filter (** {name : model .__discriminator_value__ })
8286
8387 return queryset
8488
@@ -302,7 +306,8 @@ class MultipleObjectsReturned(_MultipleObjectsReturned):
302306
303307 __default_ttl__ = None
304308
305- __polymorphic_key__ = None
309+ __polymorphic_key__ = None # DEPRECATED
310+ __discriminator_value__ = None
306311
307312 # compaction options
308313 __compaction__ = None
@@ -378,17 +383,17 @@ def _discover_polymorphic_submodels(cls):
378383 raise ModelException ('_discover_polymorphic_submodels can only be called on polymorphic base classes' )
379384
380385 def _discover (klass ):
381- if not klass ._is_polymorphic_base and klass .__polymorphic_key__ is not None :
382- cls ._polymorphic_map [klass .__polymorphic_key__ ] = klass
386+ if not klass ._is_polymorphic_base and klass .__discriminator_value__ is not None :
387+ cls ._discriminator_map [klass .__discriminator_value__ ] = klass
383388 for subklass in klass .__subclasses__ ():
384389 _discover (subklass )
385390 _discover (cls )
386391
387392 @classmethod
388- def _get_model_by_polymorphic_key (cls , key ):
393+ def _get_model_by_discriminator_value (cls , key ):
389394 if not cls ._is_polymorphic_base :
390- raise ModelException ('_get_model_by_polymorphic_key can only be called on polymorphic base classes' )
391- return cls ._polymorphic_map .get (key )
395+ raise ModelException ('_get_model_by_discriminator_value can only be called on polymorphic base classes' )
396+ return cls ._discriminator_map .get (key )
392397
393398 @classmethod
394399 def _construct_instance (cls , values ):
@@ -403,20 +408,20 @@ def _construct_instance(cls, values):
403408 field_dict = dict ([(cls ._db_map .get (k , k ), v ) for k , v in items ])
404409
405410 if cls ._is_polymorphic :
406- poly_key = field_dict .get (cls ._polymorphic_column_name )
411+ disc_key = field_dict .get (cls ._discriminator_column_name )
407412
408- if poly_key is None :
409- raise PolyMorphicModelException ('polymorphic key was not found in values' )
413+ if disc_key is None :
414+ raise PolyMorphicModelException ('discriminator value was not found in values' )
410415
411416 poly_base = cls if cls ._is_polymorphic_base else cls ._polymorphic_base
412417
413- klass = poly_base ._get_model_by_polymorphic_key ( poly_key )
418+ klass = poly_base ._get_model_by_discriminator_value ( disc_key )
414419 if klass is None :
415420 poly_base ._discover_polymorphic_submodels ()
416- klass = poly_base ._get_model_by_polymorphic_key ( poly_key )
421+ klass = poly_base ._get_model_by_discriminator_value ( disc_key )
417422 if klass is None :
418423 raise PolyMorphicModelException (
419- 'unrecognized polymorphic key {} for class {}' .format (poly_key , poly_base .__name__ )
424+ 'unrecognized discriminator column {} for class {}' .format (disc_key , poly_base .__name__ )
420425 )
421426
422427 if not issubclass (klass , cls ):
@@ -640,7 +645,7 @@ def save(self):
640645 if self ._is_polymorphic_base :
641646 raise PolyMorphicModelException ('cannot save polymorphic base model' )
642647 else :
643- setattr (self , self ._polymorphic_column_name , self .__polymorphic_key__ )
648+ setattr (self , self ._discriminator_column_name , self .__discriminator_value__ )
644649
645650 self .validate ()
646651 self .__dmlquery__ (self .__class__ , self ,
@@ -690,7 +695,7 @@ def update(self, **values):
690695 if self ._is_polymorphic_base :
691696 raise PolyMorphicModelException ('cannot update polymorphic base model' )
692697 else :
693- setattr (self , self ._polymorphic_column_name , self .__polymorphic_key__ )
698+ setattr (self , self ._discriminator_column_name , self .__disciminator_value__ )
694699
695700 self .validate ()
696701 self .__dmlquery__ (self .__class__ , self ,
@@ -757,8 +762,15 @@ def __new__(cls, name, bases, attrs):
757762 # short circuit __abstract__ inheritance
758763 is_abstract = attrs ['__abstract__' ] = attrs .get ('__abstract__' , False )
759764
760- # short circuit __polymorphic_key__ inheritance
761- attrs ['__polymorphic_key__' ] = attrs .get ('__polymorphic_key__' , None )
765+ # short circuit __discriminator_value__ inheritance
766+ # __polymorphic_key__ is deprecated
767+ poly_key = attrs .get ('__polymorphic_key__' , None )
768+ if poly_key :
769+ msg = '__polymorphic_key__ is deprecated. Use __discriminator_value__ instead'
770+ warnings .warn (msg , DeprecationWarning )
771+ log .warn (msg )
772+ attrs ['__discriminator_value__' ] = attrs .get ('__discriminator_value__' , poly_key )
773+ attrs ['__polymorphic_key__' ] = attrs ['__discriminator_value__' ]
762774
763775 def _transform_column (col_name , col_obj ):
764776 column_dict [col_name ] = col_obj
@@ -771,18 +783,18 @@ def _transform_column(col_name, col_obj):
771783 column_definitions = [(k , v ) for k , v in attrs .items () if isinstance (v , columns .Column )]
772784 column_definitions = sorted (column_definitions , key = lambda x : x [1 ].position )
773785
774- is_polymorphic_base = any ([c [1 ].polymorphic_key for c in column_definitions ])
786+ is_polymorphic_base = any ([c [1 ].discriminator_column for c in column_definitions ])
775787
776788 column_definitions = [x for x in inherited_columns .items ()] + column_definitions
777- polymorphic_columns = [c for c in column_definitions if c [1 ].polymorphic_key ]
778- is_polymorphic = len (polymorphic_columns ) > 0
779- if len (polymorphic_columns ) > 1 :
780- raise ModelDefinitionException ('only one polymorphic_key can be defined in a model, {} found' .format (len (polymorphic_columns )))
789+ discriminator_columns = [c for c in column_definitions if c [1 ].discriminator_column ]
790+ is_polymorphic = len (discriminator_columns ) > 0
791+ if len (discriminator_columns ) > 1 :
792+ raise ModelDefinitionException ('only one discriminator_column ( polymorphic_key (deprecated)) can be defined in a model, {} found' .format (len (discriminator_columns )))
781793
782- polymorphic_column_name , polymorphic_column = polymorphic_columns [0 ] if polymorphic_columns else (None , None )
794+ discriminator_column_name , discriminator_column = discriminator_columns [0 ] if discriminator_columns else (None , None )
783795
784- if isinstance (polymorphic_column , (columns .BaseContainerColumn , columns .Counter )):
785- raise ModelDefinitionException ('counter and container columns cannot be used for polymorphic keys ' )
796+ if isinstance (discriminator_column , (columns .BaseContainerColumn , columns .Counter )):
797+ raise ModelDefinitionException ('counter and container columns cannot be used as discriminator columns (polymorphic_key (deprecated)) ' )
786798
787799 # find polymorphic base class
788800 polymorphic_base = None
@@ -877,9 +889,9 @@ def _get_polymorphic_base(bases):
877889 attrs ['_is_polymorphic_base' ] = is_polymorphic_base
878890 attrs ['_is_polymorphic' ] = is_polymorphic
879891 attrs ['_polymorphic_base' ] = polymorphic_base
880- attrs ['_polymorphic_column ' ] = polymorphic_column
881- attrs ['_polymorphic_column_name ' ] = polymorphic_column_name
882- attrs ['_polymorphic_map ' ] = {} if is_polymorphic_base else None
892+ attrs ['_discriminator_column ' ] = discriminator_column
893+ attrs ['_discriminator_column_name ' ] = discriminator_column_name
894+ attrs ['_discriminator_map ' ] = {} if is_polymorphic_base else None
883895
884896 # setup class exceptions
885897 DoesNotExistBase = None
@@ -933,5 +945,12 @@ class Model(BaseModel):
933945
934946 __polymorphic_key__ = None
935947 """
936- *Optional* Specifies a value for the polymorphic key when using model inheritance.
948+ *Deprecated.*
949+
950+ see :attr:`~.__discriminator_value__`
951+ """
952+
953+ __discriminator_value__ = None
954+ """
955+ *Optional* Specifies a value for the discriminator column when using model inheritance.
937956 """
0 commit comments