Exemple #1
0
    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()
Exemple #2
0
    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()
Exemple #3
0
 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,
     ))
Exemple #4
0
 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_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.
     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,
         )))