Example #1
0
    def __init__(cls, name, bases, dct):
        super(DeclarativeObject, cls).__init__(name, bases, dct)
        for base in itertools.chain([cls], bases):
            if hasattr(base, 'primary_keys'):
                cls.fields_no_update += base.primary_keys
        # avoid duplicate entries
        cls.fields_no_update = list(set(cls.fields_no_update))

        # generate unique_keys from the model
        model = getattr(cls, 'db_model', None)
        if model and not getattr(cls, 'unique_keys', None):
            cls.unique_keys = []
            obj_field_names = set(cls.fields.keys())
            model_to_obj_translation = {
                v: k for (k, v) in cls.fields_need_translation.items()}

            for model_unique_key in model_base.get_unique_keys(model):
                obj_unique_key = [model_to_obj_translation.get(key, key)
                                  for key in model_unique_key]
                if obj_field_names.issuperset(obj_unique_key):
                    cls.unique_keys.append(obj_unique_key)

        if (hasattr(cls, 'has_standard_attributes') and
                cls.has_standard_attributes()):
            standardattributes.add_standard_attributes(cls)
        # Instantiate extra filters per class
        cls.extra_filter_names = set()
Example #2
0
    def __init__(cls, name, bases, dct):
        super(DeclarativeObject, cls).__init__(name, bases, dct)
        if 'project_id' in cls.fields:
            obj_extra_fields_set = set(cls.obj_extra_fields)
            obj_extra_fields_set.add('tenant_id')
            cls.obj_extra_fields = list(obj_extra_fields_set)
            setattr(cls, 'tenant_id',
                    property(lambda x: x.get('project_id', None)))

        fields_no_update_set = set(cls.fields_no_update)
        for base in itertools.chain([cls], bases):
            keys_set = set()
            if hasattr(base, 'primary_keys'):
                keys_set.update(base.primary_keys)
            if hasattr(base, 'obj_extra_fields'):
                keys_set.update(base.obj_extra_fields)
            for key in keys_set:
                if key in cls.fields or key in cls.obj_extra_fields:
                    fields_no_update_set.add(key)
        cls.fields_no_update = list(fields_no_update_set)

        model = getattr(cls, 'db_model', None)
        if model:
            # generate unique_keys from the model
            if not getattr(cls, 'unique_keys', None):
                cls.unique_keys = []
                obj_field_names = set(cls.fields.keys())
                model_to_obj_translation = {
                    v: k
                    for (k, v) in cls.fields_need_translation.items()
                }

                keys = db_utils.get_unique_keys(model) or []
                for model_unique_key in keys:
                    obj_unique_key = [
                        model_to_obj_translation.get(key, key)
                        for key in model_unique_key
                    ]
                    if obj_field_names.issuperset(obj_unique_key):
                        cls.unique_keys.append(obj_unique_key)
            # detach db_obj right after object is loaded from the model
            cls.create = _detach_db_obj(cls.create)
            cls.update = _detach_db_obj(cls.update)

        if (hasattr(cls, 'has_standard_attributes')
                and cls.has_standard_attributes()):
            setattr(
                cls, 'standard_attr_id',
                property(lambda x: x.db_obj.standard_attr_id
                         if x.db_obj else None))
            standardattributes.add_standard_attributes(cls)
            standardattributes.add_tag_filter_names(cls)
        # Instantiate extra filters per class
        cls.extra_filter_names = set(cls.extra_filter_names)
        # add tenant_id filter for objects that have project_id
        if 'project_id' in cls.fields and 'tenant_id' not in cls.fields:
            cls.extra_filter_names.add('tenant_id')
Example #3
0
    def __init__(cls, name, bases, dct):
        super(DeclarativeObject, cls).__init__(name, bases, dct)
        if 'project_id' in cls.fields:
            obj_extra_fields_set = set(cls.obj_extra_fields)
            obj_extra_fields_set.add('tenant_id')
            cls.obj_extra_fields = list(obj_extra_fields_set)
            setattr(cls, 'tenant_id',
                    property(lambda x: x.get('project_id', None)))

        fields_no_update_set = set(cls.fields_no_update)
        for base in itertools.chain([cls], bases):
            keys_set = set()
            if hasattr(base, 'primary_keys'):
                keys_set.update(base.primary_keys)
            if hasattr(base, 'obj_extra_fields'):
                keys_set.update(base.obj_extra_fields)
            for key in keys_set:
                if key in cls.fields or key in cls.obj_extra_fields:
                    fields_no_update_set.add(key)
        cls.fields_no_update = list(fields_no_update_set)

        model = getattr(cls, 'db_model', None)
        if model:
            # generate unique_keys from the model
            if not getattr(cls, 'unique_keys', None):
                cls.unique_keys = []
                obj_field_names = set(cls.fields.keys())
                model_to_obj_translation = {
                    v: k for (k, v) in cls.fields_need_translation.items()}

                keys = db_utils.get_unique_keys(model) or []
                for model_unique_key in keys:
                    obj_unique_key = [model_to_obj_translation.get(key, key)
                                      for key in model_unique_key]
                    if obj_field_names.issuperset(obj_unique_key):
                        cls.unique_keys.append(obj_unique_key)
            cls.create = _guarantee_rw_subtransaction(cls.create)
            cls.update = _guarantee_rw_subtransaction(cls.update)

        if (hasattr(cls, 'has_standard_attributes') and
                cls.has_standard_attributes()):
            setattr(cls, 'standard_attr_id',
                    property(lambda x: x.db_obj.standard_attr_id
                             if x.db_obj else None))
            standardattributes.add_standard_attributes(cls)
            standardattributes.add_tag_filter_names(cls)
        # Instantiate extra filters per class
        cls.extra_filter_names = set(cls.extra_filter_names)
        # add tenant_id filter for objects that have project_id
        if 'project_id' in cls.fields and 'tenant_id' not in cls.fields:
            cls.extra_filter_names.add('tenant_id')

        invalid_fields = [f for f in cls.synthetic_fields
                          if f not in cls.fields]
        if invalid_fields:
            raise o_exc.NeutronObjectValidatorException(fields=invalid_fields)
Example #4
0
 def __init__(cls, name, bases, dct):
     super(DeclarativeObject, cls).__init__(name, bases, dct)
     for base in itertools.chain([cls], bases):
         if hasattr(base, 'primary_keys'):
             cls.fields_no_update += base.primary_keys
     # avoid duplicate entries
     cls.fields_no_update = list(set(cls.fields_no_update))
     if (hasattr(cls, 'has_standard_attributes') and
             cls.has_standard_attributes()):
         standardattributes.add_standard_attributes(cls)
Example #5
0
 def __init__(cls, name, bases, dct):
     super(DeclarativeObject, cls).__init__(name, bases, dct)
     for base in itertools.chain([cls], bases):
         if hasattr(base, 'primary_keys'):
             cls.fields_no_update += base.primary_keys
     # avoid duplicate entries
     cls.fields_no_update = list(set(cls.fields_no_update))
     if (hasattr(cls, 'has_standard_attributes')
             and cls.has_standard_attributes()):
         standardattributes.add_standard_attributes(cls)
Example #6
0
    def __init__(cls, name, bases, dct):
        super(DeclarativeObject, cls).__init__(name, bases, dct)
        if 'project_id' in cls.fields:
            obj_extra_fields_set = set(cls.obj_extra_fields)
            obj_extra_fields_set.add('tenant_id')
            cls.obj_extra_fields = list(obj_extra_fields_set)
            setattr(cls, 'tenant_id',
                    property(lambda x: x.get('project_id', None)))

        fields_no_update_set = set(cls.fields_no_update)
        for base in itertools.chain([cls], bases):
            keys_set = set()
            if hasattr(base, 'primary_keys'):
                keys_set.update(base.primary_keys)
            if hasattr(base, 'obj_extra_fields'):
                keys_set.update(base.obj_extra_fields)
            for key in keys_set:
                if key in cls.fields or key in cls.obj_extra_fields:
                    fields_no_update_set.add(key)
        cls.fields_no_update = list(fields_no_update_set)

        model = getattr(cls, 'db_model', None)
        if model:
            # generate unique_keys from the model
            if not getattr(cls, 'unique_keys', None):
                cls.unique_keys = []
                obj_field_names = set(cls.fields.keys())
                model_to_obj_translation = {
                    v: k for (k, v) in cls.fields_need_translation.items()}

                keys = db_utils.get_unique_keys(model) or []
                for model_unique_key in keys:
                    obj_unique_key = [model_to_obj_translation.get(key, key)
                                      for key in model_unique_key]
                    if obj_field_names.issuperset(obj_unique_key):
                        cls.unique_keys.append(obj_unique_key)
            # detach db_obj right after object is loaded from the model
            cls.create = _detach_db_obj(cls.create)
            cls.update = _detach_db_obj(cls.update)

        if (hasattr(cls, 'has_standard_attributes') and
                cls.has_standard_attributes()):
            setattr(cls, 'standard_attr_id',
                    property(lambda x: x.db_obj.standard_attr_id
                             if x.db_obj else None))
            standardattributes.add_standard_attributes(cls)
        # Instantiate extra filters per class
        cls.extra_filter_names = set(cls.extra_filter_names)
Example #7
0
    def __init__(cls, name, bases, dct):
        super(DeclarativeObject, cls).__init__(name, bases, dct)
        if 'project_id' in cls.fields:
            obj_extra_fields_set = set(cls.obj_extra_fields)
            obj_extra_fields_set.add('tenant_id')
            cls.obj_extra_fields = list(obj_extra_fields_set)
            setattr(cls, 'tenant_id', property(lambda x: x.project_id))

        fields_no_update_set = set(cls.fields_no_update)
        for base in itertools.chain([cls], bases):
            keys_set = set()
            if hasattr(base, 'primary_keys'):
                keys_set.update(base.primary_keys)
            if hasattr(base, 'obj_extra_fields'):
                keys_set.update(base.obj_extra_fields)
            for key in keys_set:
                if key in cls.fields or key in cls.obj_extra_fields:
                    fields_no_update_set.add(key)
        cls.fields_no_update = list(fields_no_update_set)

        # generate unique_keys from the model
        model = getattr(cls, 'db_model', None)
        if model and not getattr(cls, 'unique_keys', None):
            cls.unique_keys = []
            obj_field_names = set(cls.fields.keys())
            model_to_obj_translation = {
                v: k
                for (k, v) in cls.fields_need_translation.items()
            }

            for model_unique_key in model_base.get_unique_keys(model):
                obj_unique_key = [
                    model_to_obj_translation.get(key, key)
                    for key in model_unique_key
                ]
                if obj_field_names.issuperset(obj_unique_key):
                    cls.unique_keys.append(obj_unique_key)

        if (hasattr(cls, 'has_standard_attributes')
                and cls.has_standard_attributes()):
            standardattributes.add_standard_attributes(cls)
        # Instantiate extra filters per class
        cls.extra_filter_names = set()