def new(self, model_class, shelve=False, named_shelve=None, persist_dependencies=True, **kwargs): """ Create an instance filled with data without persist it. 1) validate all kwargs match Model.fields. 2) validate model is a model.Model class. 3) Iterate model fields: for each field, fill it with data. @shelve: the current configuration will be stored in the DDF library. It can be True or a string (named shelve). @named_shelve: restore configuration saved in DDF library with a name. @persist_dependencies: tell if internal dependencies will be saved in the database or not. """ if self.debug_mode: LOGGER.debug('>>> [%s] Generating instance.' % get_unique_model_name(model_class)) configuration = self._configure_params(model_class, shelve, named_shelve, **kwargs) instance = model_class() if not is_model_class(instance): raise InvalidModelError(get_unique_model_name(model_class)), None, sys.exc_info()[2] for field in get_fields_from_model(model_class): if is_key_field(field) and 'id' not in configuration: continue if field.name in self.ignore_fields: continue self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration) number_of_pending_fields = len(self.pending_fields) # For Copier fixtures: dealing with pending fields that need to receive values of another fields. i = 0 while self.pending_fields != []: field_name = self.pending_fields.pop(0) field = get_field_by_name_or_raise(model_class, field_name) self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration) i += 1 if i > 2 * number_of_pending_fields: # dealing with infinite loop too. raise InvalidConfigurationError(get_unique_field_name(field), u'Cyclic dependency of Copiers.'), None, sys.exc_info()[2] if self.debug_mode: LOGGER.debug('<<< [%s] Instance created.' % get_unique_model_name(model_class)) return instance
def new(self, model_class, shelve=False, named_shelve=None, persist_dependencies=True, **kwargs): """ Create an instance filled with data without persist it. 1) validate all kwargs match Model.fields. 2) validate model is a model.Model class. 3) Iterate model fields: for each field, fill it with data. :shelve: the current configuration will be stored in the DDF library. It can be True or a string (named shelve). :named_shelve: restore configuration saved in DDF library with a name. :persist_dependencies: tell if internal dependencies will be saved in the database or not. """ if self.debug_mode: LOGGER.debug('>>> [%s] Generating instance.' % get_unique_model_name(model_class)) configuration = self._configure_params(model_class, shelve, named_shelve, **kwargs) instance = model_class() if not is_model_class(instance): raise InvalidModelError(get_unique_model_name(model_class)) for field in get_fields_from_model(model_class): if is_key_field(field) and 'id' not in configuration: continue if field.name not in self.kwargs and self._is_ignored_field(field.name): continue self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration) number_of_pending_fields = len(self.pending_fields) # For Copier fixtures: dealing with pending fields that need to receive values of another fields. i = 0 while self.pending_fields != []: field_name = self.pending_fields.pop(0) field = get_field_by_name_or_raise(model_class, field_name) self.set_data_for_a_field(model_class, instance, field, persist_dependencies=persist_dependencies, **configuration) i += 1 if i > 2 * number_of_pending_fields: # dealing with infinite loop too. raise InvalidConfigurationError(get_unique_field_name(field), 'Cyclic dependency of Copiers.') if self.debug_mode: LOGGER.debug('<<< [%s] Instance created.' % get_unique_model_name(model_class)) return instance
def _configure_params(self, model_class, shelve, named_shelve, **kwargs): """ 1) validate kwargs 2) load default fixture from DDF library. Store default fixture in DDF library. 3) Load fixtures defined in F attributes. """ if self.validate_args: self._validate_kwargs(model_class, kwargs) library = DDFLibrary.get_instance() if shelve: # shelving before use_library property: do not twist two different configurations (anti-pattern) for field_name in kwargs.keys(): if field_name in self._DDF_CONFIGS: continue field = get_field_by_name_or_raise(model_class, field_name) fixture = kwargs[field_name] if field.unique and not (isinstance( fixture, (DynamicFixture, Copier, DataFixture)) or callable(fixture)): raise InvalidConfigurationError( 'It is not possible to store static values for fields with unique=True (%s)' % get_unique_field_name(field)) library.add_configuration(model_class, kwargs, name=shelve) if self.use_library: # load ddf_setup.py of the model application app_name = get_app_name_of_model(model_class) if app_name not in _LOADED_DDF_SETUP_MODULES: full_module_name = '%s.tests.ddf_setup' % app_name try: _LOADED_DDF_SETUP_MODULES.append(app_name) import_module(full_module_name) except ImportError: pass # ignoring if module does not exist except Exception as e: six.reraise(InvalidDDFSetupError, InvalidDDFSetupError(e), sys.exc_info()[2]) configuration_default = library.get_configuration( model_class, name=DDFLibrary.DEFAULT_KEY) configuration_custom = library.get_configuration(model_class, name=named_shelve) configuration = {} configuration.update( configuration_default) # always use default configuration configuration.update( configuration_custom) # override default configuration configuration.update( kwargs ) # override shelved configuration with current configuration else: configuration = kwargs configuration.update( self.kwargs ) # Used by F: kwargs are passed by constructor, not by get. return configuration
def teach(self, model_class, ddf_lesson=None, **kwargs): library = DDFLibrary.get_instance() for field_name in kwargs.keys(): if field_name in self._DDF_CONFIGS: continue field = get_field_by_name_or_raise(model_class, field_name) fixture = kwargs[field_name] if field.unique and not (isinstance( fixture, (DynamicFixture, Copier, DataFixture)) or callable(fixture)): raise InvalidConfigurationError( 'It is not possible to store static values for fields with unique=True (%s). Try using a lambda function instead.' % get_unique_field_name(field)) library.add_configuration(model_class, kwargs, name=ddf_lesson)
def _configure_params(self, model_class, shelve, named_shelve, **kwargs): """ 1) validate kwargs 2) load default fixture from DDF library. Store default fixture in DDF library. 3) Load fixtures defined in F attributes. """ if self.validate_args: self._validate_kwargs(model_class, kwargs) library = DDFLibrary.get_instance() if shelve: # shelving before use_library property: do not twist two different configurations (anti-pattern) for field_name in kwargs.keys(): if field_name in self._DDF_CONFIGS: continue field = get_field_by_name_or_raise(model_class, field_name) fixture = kwargs[field_name] if field.unique and not (isinstance(fixture, (DynamicFixture, Copier, DataFixture)) or callable(fixture)): raise InvalidConfigurationError('It is not possible to store static values for fields with unique=True (%s)' % get_unique_field_name(field)) library.add_configuration(model_class, kwargs, name=shelve) if self.use_library: # load ddf_setup.py of the model application app_name = get_app_name_of_model(model_class) if app_name not in _LOADED_DDF_SETUP_MODULES: full_module_name = '%s.tests.ddf_setup' % app_name try: _LOADED_DDF_SETUP_MODULES.append(app_name) import_module(full_module_name) except ImportError: pass # ignoring if module does not exist except Exception as e: raise InvalidDDFSetupError(e), None, sys.exc_info()[2] configuration_default = library.get_configuration(model_class, name=DDFLibrary.DEFAULT_KEY) configuration_custom = library.get_configuration(model_class, name=named_shelve) configuration = {} configuration.update(configuration_default) # always use default configuration configuration.update(configuration_custom) # override default configuration configuration.update(kwargs) # override shelved configuration with current configuration else: configuration = kwargs configuration.update(self.kwargs) # Used by F: kwargs are passed by constructor, not by get. return configuration
def immediate_field_name(self, instance): model_class = instance.__class__ field_name = self.expression.split('.')[0] get_field_by_name_or_raise(model_class, field_name) return field_name
def new(self, model_class, ddf_lesson=None, persist_dependencies=True, **kwargs): ''' Create an instance filled with data without persist it. 1) validate all kwargs match Model.fields. 2) validate model is a model.Model class. 3) Iterate model fields: for each field, fill it with data. :ddf_lesson: the lesson that will be used to create the model instance, if exists. :persist_dependencies: tell if internal dependencies will be saved in the database or not. ''' if self.debug_mode: LOGGER.debug('>>> [%s] Generating instance.' % get_unique_model_name(model_class)) configuration = self._configure_params(model_class, ddf_lesson, **kwargs) instance = model_class() if not is_model_class(instance): raise InvalidModelError(get_unique_model_name(model_class)) try: # https://github.com/paulocheque/django-dynamic-fixture/pull/112 from polymorphic import PolymorphicModel is_polymorphic = isinstance(instance, PolymorphicModel) except ImportError: # Django-polymorphic is not installed so the model can't be polymorphic. is_polymorphic = False for field in get_fields_from_model(model_class): if is_key_field(field) and field.name not in configuration: continue if field.name not in self.kwargs and self._is_ignored_field( field.name): continue if is_polymorphic and (field.name == 'polymorphic_ctype' or field.primary_key): continue self.set_data_for_a_field( model_class, instance, field, persist_dependencies=persist_dependencies, **configuration) number_of_pending_fields = len(self.pending_fields) # For Copier fixtures: dealing with pending fields that need to receive values of another fields. i = 0 while self.pending_fields != []: field_name = self.pending_fields.pop(0) field = get_field_by_name_or_raise(model_class, field_name) self.set_data_for_a_field( model_class, instance, field, persist_dependencies=persist_dependencies, **configuration) i += 1 if i > 2 * number_of_pending_fields: # dealing with infinite loop too. raise InvalidConfigurationError( get_unique_field_name(field), 'Cyclic dependency of Copiers.') if self.debug_mode: LOGGER.debug('<<< [%s] Instance created.' % get_unique_model_name(model_class)) return instance