def process_m2m(self, instance, field): # check django's version number to determine how intermediary models # are checked if they are auto created or not. from django import VERSION auto_created_through_model = False through = field.rel.through if VERSION < (1, 2): if through: if isinstance(through, basestring): bits = through.split('.') if len(bits) < 2: bits = [instance._meta.app_label] + bits through = models.get_model(*bits) else: auto_created_through_model = True else: auto_created_through_model = through._meta.auto_created if auto_created_through_model: return self.process_field(instance, field) # if m2m relation has intermediary model: # * only generate relation if 'generate_m2m' is given # * first generate intermediary model and assign a newly created # related model to the foreignkey if field.name in self.generate_m2m: # get fk to related model on intermediary model related_fks = [fk for fk in through._meta.fields if isinstance(fk, related.ForeignKey) and \ fk.rel.to is field.rel.to] self_fks = [fk for fk in through._meta.fields if isinstance(fk, related.ForeignKey) and \ fk.rel.to is self.model] assert len(related_fks) == 1 assert len(self_fks) == 1 related_fk = related_fks[0] self_fk = self_fks[0] min_count, max_count = self.generate_m2m[field.name] related_mockup = get_mockup(field.rel.to) related_generator = generators.InstanceGenerator(related_mockup) through_mockup = get_mockup(through) # update the through mockup factory params = { self_fk.name: generators.StaticGenerator(instance), related_fk.name: generators.InstanceGenerator(related_mockup), } through_mockup.update_fieldname_generator(**params) generator = generators.MultipleInstanceGenerator(through_mockup, min_count=min_count, max_count=max_count) generator.generate()
def get_generator(self, field, generate_m2m=None, follow_m2m=None, **kwargs): if field.name in generate_m2m: min_count, max_count = generate_m2m[field.name] return MultipleInstanceGenerator( get_mockup(field.rel.to), limit_choices_to=field.rel.limit_choices_to, min_count=min_count, max_count=max_count, ) elif field.name in follow_m2m: min_count, max_count = follow_m2m[field.name] return InstanceSelector( field.rel.to, limit_choices_to=field.rel.limit_choices_to, min_count=min_count, max_count=max_count, ) elif field.blank or field.null: return StaticGenerator([]) raise GeneratorException( u'Cannot assign instances of "%s" to ManyToManyField "%s". ' u'Provide either "follow_m2m" or "generate_m2m" argument.' % ( '%s.%s' % ( field.rel.to._meta.app_label, field.rel.to._meta.object_name, ), field.name, ))
def get_generator(self, field, generate_fk=None, follow_fk=None, **kwargs): # if generate_fk is set, follow_fk is ignored. # also generate fk if field is unique to ensure uniqueness. if field.name in generate_fk or self.field.unique: mockup = get_mockup( field.rel.to, follow_fk=follow_fk.get_deep_links(field.name), generate_fk=generate_fk.get_deep_links(field.name) ) return InstanceGenerator( mockup, limit_choices_to=field.rel.limit_choices_to ) elif field.name in follow_fk: return InstanceSelector( field.rel.to, limit_choices_to=field.rel.limit_choices_to ) elif field.blank or field.null: return StaticGenerator(None) raise GeneratorException( u'Cannot resolve ForeignKey "%s" to "%s". Provide either ' u'"follow_fk" or "generate_fk" parameters.' % ( field.name, '%s.%s' % ( field.rel.to._meta.app_label, field.rel.to._meta.object_name, ) ))
def get_generator(self, field, generate_fk=None, follow_fk=None, **kwargs): # if generate_fk is set, follow_fk is ignored. if field.name in generate_fk: mockup = get_mockup(field.rel.to, follow_fk=follow_fk.get_deep_links(field.name), generate_fk=generate_fk.get_deep_links( field.name)) return InstanceGenerator( mockup, limit_choices_to=field.rel.limit_choices_to) elif field.name in follow_fk: return InstanceSelector( field.rel.to, limit_choices_to=field.rel.limit_choices_to) elif field.blank or field.null: return StaticGenerator(None) raise GeneratorException( u'Cannot resolve ForeignKey "%s" to "%s". Provide either ' u'"follow_fk" or "generate_fk" parameters.' % (field.name, '%s.%s' % ( field.rel.to._meta.app_label, field.rel.to._meta.object_name, )))