def test_instance_selector(self): AutoFixture(SimpleModel).create(10) result = generators.InstanceSelector(SimpleModel).generate() self.assertEqual(result.__class__, SimpleModel) for i in range(10): result = generators.InstanceSelector(SimpleModel, max_count=10).generate() self.assertTrue(0 <= len(result) <= 10) for obj in result: self.assertEqual(obj.__class__, SimpleModel) for i in range(10): result = generators.InstanceSelector(SimpleModel, min_count=5, max_count=10).generate() self.assertTrue(5 <= len(result) <= 10) for obj in result: self.assertEqual(obj.__class__, SimpleModel) for i in range(10): result = generators.InstanceSelector(SimpleModel, min_count=20, max_count=100).generate() # cannot return more instances than available self.assertEqual(len(result), 10) for obj in result: self.assertEqual(obj.__class__, SimpleModel) # works also with queryset as argument result = generators.InstanceSelector( SimpleModel.objects.all()).generate() self.assertEqual(result.__class__, SimpleModel)
def post_process_instance(self, instance, commit): groups = instance.user_groups.all() valid_members = User.objects.exclude(usergroup__in=groups, ) generators.MultipleInstanceGenerator( AutoFixture( ProjectMembership, field_values={ 'project': instance, 'member': generators.InstanceSelector(valid_members), }, ), min_count=1, max_count=2, ).generate() region_generator = generators.WeightedGenerator([ ( generators.InstanceSelector( Region, limit_choices_to={'public': True}, ), 4, ), ( generators.InstanceGenerator( RegionAutoFixture(Region, field_values={'public': False})), 2, ), ]) regions = [ region_generator.generate() for _ in range(random.randint(1, 3)) ] instance.regions.set(list(regions))
class PedidoAutoFixture(AutoFixture): field_values = { 'referencia_pedido': generators.StaticGenerator(1), 'unidades': random.randint(100, 5000), 'talla': random.choice(('M', 'L', 'XL', 'XXL')), 'cliente': generators.InstanceSelector(User, limit_choices_to={'username':"******"}), }
def get_generator(self, field): ''' Return a value generator based on the field instance that is passed to this method. This function may return ``None`` which means that the specified field will be ignored (e.g. if no matching generator was found). ''' if isinstance(field, fields.AutoField): return None if self.is_inheritance_parent(field): return None if ( field.default is not fields.NOT_PROVIDED and not self.overwrite_defaults and field.name not in self.field_values): return None kwargs = {} if field.name in self.field_values: value = self.field_values[field.name] if isinstance(value, generators.Generator): return value elif isinstance(value, AutoFixture): return generators.InstanceGenerator(autofixture=value) elif callable(value): return generators.CallableGenerator(value=value) return generators.StaticGenerator(value=value) if field.null: kwargs['empty_p'] = self.none_p if field.choices: return generators.ChoicesGenerator(choices=field.choices, **kwargs) if isinstance(field, related.ForeignKey): # if generate_fk is set, follow_fk is ignored. is_self_fk = (get_remote_field_to(field)().__class__ == self.model) if field.name in self.generate_fk and not is_self_fk: return generators.InstanceGenerator( autofixture.get( get_remote_field_to(field), follow_fk=self.follow_fk.get_deep_links(field.name), generate_fk=self.generate_fk.get_deep_links(field.name)), limit_choices_to=get_remote_field(field).limit_choices_to) if field.name in self.follow_fk: selected = generators.InstanceSelector( get_remote_field_to(field), limit_choices_to=get_remote_field(field).limit_choices_to) if selected.get_value() is not None: return selected if field.blank or field.null: return generators.NoneGenerator() if is_self_fk and not field.null: raise CreateInstanceError( u'Cannot resolve self referencing field "%s" to "%s" without null=True' % ( field.name, '%s.%s' % ( get_remote_field_to(field)._meta.app_label, get_remote_field_to(field)._meta.object_name, ) )) raise CreateInstanceError( u'Cannot resolve ForeignKey "%s" to "%s". Provide either ' u'"follow_fk" or "generate_fk" parameters.' % ( field.name, '%s.%s' % ( get_remote_field_to(field)._meta.app_label, get_remote_field_to(field)._meta.object_name, ) )) if isinstance(field, related.ManyToManyField): if field.name in self.generate_m2m: min_count, max_count = self.generate_m2m[field.name] return generators.MultipleInstanceGenerator( autofixture.get(get_remote_field_to(field)), limit_choices_to=get_remote_field(field).limit_choices_to, min_count=min_count, max_count=max_count, **kwargs) if field.name in self.follow_m2m: min_count, max_count = self.follow_m2m[field.name] return generators.InstanceSelector( get_remote_field_to(field), limit_choices_to=get_remote_field(field).limit_choices_to, min_count=min_count, max_count=max_count, **kwargs) if field.blank or field.null: return generators.StaticGenerator([]) raise CreateInstanceError( u'Cannot assign instances of "%s" to ManyToManyField "%s". ' u'Provide either "follow_m2m" or "generate_m2m" argument.' % ( '%s.%s' % ( get_remote_field_to(field)._meta.app_label, get_remote_field_to(field)._meta.object_name, ), field.name, )) if isinstance(field, fields.FilePathField): return generators.FilePathGenerator( path=field.path, match=field.match, recursive=field.recursive, max_length=field.max_length, **kwargs) if isinstance(field, fields.CharField): if isinstance(field, fields.SlugField): generator = generators.SlugGenerator elif isinstance(field, fields.EmailField): return generators.EmailGenerator( max_length=min(field.max_length, 30)) elif isinstance(field, fields.URLField): return generators.URLGenerator( max_length=min(field.max_length, 25)) elif field.max_length > 15: return generators.LoremSentenceGenerator( common=False, max_length=field.max_length) else: generator = generators.StringGenerator return generator(max_length=field.max_length) if isinstance(field, fields.DecimalField): return generators.DecimalGenerator( decimal_places=field.decimal_places, max_digits=field.max_digits) if hasattr(fields, 'BigIntegerField'): if isinstance(field, fields.BigIntegerField): return generators.IntegerGenerator( min_value=-field.MAX_BIGINT - 1, max_value=field.MAX_BIGINT, **kwargs) if isinstance(field, ImageField): return generators.ImageGenerator(storage=field.storage, **kwargs) for field_class, generator in self.field_to_generator.items(): if isinstance(field, field_class): return generator(**kwargs) return None