Beispiel #1
0
    def test_generic_inline_formsets(self):
        GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
        formset = GenericFormSet()
        self.assertHTMLEqual(''.join(form.as_p() for form in formset.forms), """<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p>""")

        formset = GenericFormSet(instance=Animal())
        self.assertHTMLEqual(''.join(form.as_p() for form in formset.forms), """<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p>""")

        platypus = Animal.objects.create(
            common_name="Platypus", latin_name="Ornithorhynchus anatinus"
        )
        platypus.tags.create(tag="shiny")
        GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
        formset = GenericFormSet(instance=platypus)
        tagged_item_id = TaggedItem.objects.get(
            tag='shiny', object_id=platypus.id
        ).id
        self.assertHTMLEqual(''.join(form.as_p() for form in formset.forms), """<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" value="shiny" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" value="%s" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p><p><label for="id_generic_relations-taggeditem-content_type-object_id-1-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-1-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-1-tag" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-1-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-1-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-1-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-1-id" id="id_generic_relations-taggeditem-content_type-object_id-1-id" /></p>""" % tagged_item_id)

        lion = Animal.objects.create(common_name="Lion", latin_name="Panthera leo")
        formset = GenericFormSet(instance=lion, prefix='x')
        self.assertHTMLEqual(''.join(form.as_p() for form in formset.forms), """<p><label for="id_x-0-tag">Tag:</label> <input id="id_x-0-tag" type="text" name="x-0-tag" maxlength="50" /></p>
<p><label for="id_x-0-DELETE">Delete:</label> <input type="checkbox" name="x-0-DELETE" id="id_x-0-DELETE" /><input type="hidden" name="x-0-id" id="id_x-0-id" /></p>""")
Beispiel #2
0
    def test_incorrect_content_type(self):
        class BadModel(models.Model):
            content_type = models.PositiveIntegerField()

        msg = "fk_name 'generic_relations.BadModel.content_type' is not a ForeignKey to ContentType"
        with self.assertRaisesMessage(Exception, msg):
            generic_inlineformset_factory(BadModel, TaggedItemForm)
Beispiel #3
0
    def test_save_new_uses_form_save(self):
        """
        Regression for #16260: save_new should call form.save()
        """
        class SaveTestForm(forms.ModelForm):
            def save(self, *args, **kwargs):
                self.instance.saved_by = "custom method"
                return super(SaveTestForm, self).save(*args, **kwargs)

        Formset = generic_inlineformset_factory(
            ForProxyModelModel, fields='__all__', form=SaveTestForm)

        instance = ProxyRelatedModel.objects.create()

        data = {
            'form-TOTAL_FORMS': '1',
            'form-INITIAL_FORMS': '0',
            'form-MAX_NUM_FORMS': '',
            'form-0-title': 'foo',
        }

        formset = Formset(data, instance=instance, prefix='form')
        self.assertTrue(formset.is_valid())
        new_obj = formset.save()[0]
        self.assertEqual(new_obj.saved_by, "custom method")
Beispiel #4
0
 def test_options(self):
     TaggedItemFormSet = generic_inlineformset_factory(
         TaggedItem,
         can_delete=False,
         exclude=['tag'],
         extra=3,
     )
     platypus = Animal.objects.create(common_name='Platypus', latin_name='Ornithorhynchus anatinus')
     harmless = platypus.tags.create(tag='harmless')
     mammal = platypus.tags.create(tag='mammal')
     # Works without a queryset.
     formset = TaggedItemFormSet(instance=platypus)
     self.assertEqual(len(formset.forms), 5)
     self.assertHTMLEqual(
         formset.forms[0].as_p(),
         '<input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" value="%s" '
         'id="id_generic_relations-taggeditem-content_type-object_id-0-id" />' % harmless.pk
     )
     self.assertEqual(formset.forms[0].instance, harmless)
     self.assertEqual(formset.forms[1].instance, mammal)
     self.assertIsNone(formset.forms[2].instance.pk)
     # A queryset can be used to alter display ordering.
     formset = TaggedItemFormSet(instance=platypus, queryset=TaggedItem.objects.order_by('-tag'))
     self.assertEqual(len(formset.forms), 5)
     self.assertEqual(formset.forms[0].instance, mammal)
     self.assertEqual(formset.forms[1].instance, harmless)
     self.assertIsNone(formset.forms[2].instance.pk)
     # A queryset that omits items.
     formset = TaggedItemFormSet(instance=platypus, queryset=TaggedItem.objects.filter(tag__startswith='harm'))
     self.assertEqual(len(formset.forms), 4)
     self.assertEqual(formset.forms[0].instance, harmless)
     self.assertIsNone(formset.forms[1].instance.pk)
Beispiel #5
0
    def get_formset(self, **kwargs):
        if self.exclude is None:
            exclude = []
        else:
            exclude = list(self.exclude)
        exclude.extend(self.get_readonly_fields())
        if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude:
            # Take the custom ModelForm's Meta.exclude into account only if the
            # GenericInlineModelAdmin doesn't define its own.
            exclude.extend(self.form._meta.exclude)
        exclude = exclude or None
        can_delete = self.can_delete and self.has_delete_permission()
        defaults = {
            "ct_field": self.ct_field,
            "fk_field": self.ct_fk_field,
            "form": self.form,
            "formfield_callback": self.formfield_for_dbfield,
            "formset": self.formset,
            "extra": self.extra,
            "can_delete": can_delete,
            "can_order": False,
            "max_num": self.max_num,
            "exclude": exclude,
            'fields': forms.ALL_FIELDS
        }
        defaults.update(kwargs)

        return generic_inlineformset_factory(self.model, **defaults)
Beispiel #6
0
    def get_formset(self, request, obj=None, **kwargs):
        if 'fields' in kwargs:
            fields = kwargs.pop('fields')
        else:
            fields = flatten_fieldsets(self.get_fieldsets(request, obj))
        if self.exclude is None:
            exclude = []
        else:
            exclude = list(self.exclude)
        exclude.extend(self.get_readonly_fields(request, obj))
        if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude:
            # Take the custom ModelForm's Meta.exclude into account only if the
            # GenericInlineModelAdmin doesn't define its own.
            exclude.extend(self.form._meta.exclude)
        exclude = exclude or None
        can_delete = self.can_delete and self.has_delete_permission(request, obj)
        defaults = {
            "ct_field": self.ct_field,
            "fk_field": self.ct_fk_field,
            "form": self.form,
            "formfield_callback": partial(self.formfield_for_dbfield, request=request),
            "formset": self.formset,
            "extra": self.extra,
            "can_delete": can_delete,
            "can_order": False,
            "fields": fields,
            "max_num": self.max_num,
            "exclude": exclude
        }
        defaults.update(kwargs)

        if defaults['fields'] is None and not modelform_defines_fields(defaults['form']):
            defaults['fields'] = ALL_FIELDS

        return generic_inlineformset_factory(self.model, **defaults)
Beispiel #7
0
    def get_formset(self, request, obj=None, **kwargs):
        if 'fields' in kwargs:
            fields = kwargs.pop('fields')
        else:
            fields = flatten_fieldsets(self.get_fieldsets(request, obj))
        exclude = [*(self.exclude or []), *self.get_readonly_fields(request, obj)]
        if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude:
            # Take the custom ModelForm's Meta.exclude into account only if the
            # GenericInlineModelAdmin doesn't define its own.
            exclude.extend(self.form._meta.exclude)
        exclude = exclude or None
        can_delete = self.can_delete and self.has_delete_permission(request, obj)
        defaults = {
            'ct_field': self.ct_field,
            'fk_field': self.ct_fk_field,
            'form': self.form,
            'formfield_callback': partial(self.formfield_for_dbfield, request=request),
            'formset': self.formset,
            'extra': self.get_extra(request, obj),
            'can_delete': can_delete,
            'can_order': False,
            'fields': fields,
            'min_num': self.get_min_num(request, obj),
            'max_num': self.get_max_num(request, obj),
            'exclude': exclude,
            **kwargs,
        }

        if defaults['fields'] is None and not modelform_defines_fields(defaults['form']):
            defaults['fields'] = ALL_FIELDS

        return generic_inlineformset_factory(self.model, **defaults)
def generic_polymorphic_inlineformset_factory(model, formset_children, form=ModelForm,
                                              formset=BaseGenericPolymorphicInlineFormSet,
                                              ct_field="content_type", fk_field="object_id",
                                              # Base form
                                              # TODO: should these fields be removed in favor of creating
                                              # the base form as a formset child too?
                                              fields=None, exclude=None,
                                              extra=1, can_order=False, can_delete=True,
                                              max_num=None, formfield_callback=None,
                                              validate_max=False, for_concrete_model=True,
                                              min_num=None, validate_min=False, child_form_kwargs=None):
    """
    Construct the class for a generic inline polymorphic formset.

    All arguments are identical to :func:`~django.contrib.contenttypes.forms.generic_inlineformset_factory`,
    with the exception of the ``formset_children`` argument.

    :param formset_children: A list of all child :class:`PolymorphicFormSetChild` objects
                             that tell the inline how to render the child model types.
    :type formset_children: Iterable[PolymorphicFormSetChild]
    :rtype: type
    """
    kwargs = {
        'model': model,
        'form': form,
        'formfield_callback': formfield_callback,
        'formset': formset,
        'ct_field': ct_field,
        'fk_field': fk_field,
        'extra': extra,
        'can_delete': can_delete,
        'can_order': can_order,
        'fields': fields,
        'exclude': exclude,
        'min_num': min_num,
        'max_num': max_num,
        'validate_min': validate_min,
        'validate_max': validate_max,
        'for_concrete_model': for_concrete_model,
        # 'localized_fields': localized_fields,
        # 'labels': labels,
        # 'help_texts': help_texts,
        # 'error_messages': error_messages,
        # 'field_classes': field_classes,
    }
    if child_form_kwargs is None:
        child_form_kwargs = {}

    child_kwargs = {
        # 'exclude': exclude,
        'ct_field': ct_field,
        'fk_field': fk_field,
    }
    if child_form_kwargs:
        child_kwargs.update(child_form_kwargs)

    FormSet = generic_inlineformset_factory(**kwargs)
    FormSet.child_forms = polymorphic_child_forms_factory(formset_children, **child_kwargs)
    return FormSet
 def get_documents_formset(self):
     return generic_inlineformset_factory(
         EvidienceDocument,
         formset=CustomGenericInlineFormSet,
         form=DocumentForm,
         fields=("template", "document_number"),
         extra=1,
     )
Beispiel #10
0
 def test_get_queryset_ordering(self):
     """
     BaseGenericInlineFormSet.get_queryset() adds default ordering, if
     needed.
     """
     inline_formset = generic_inlineformset_factory(TaggedItem, exclude=('tag',))
     formset = inline_formset(instance=Gecko.objects.create())
     self.assertIs(formset.get_queryset().ordered, True)
Beispiel #11
0
    def test_generic_inline_formset_factory(self):
        # Regression test for #10522.
        inline_formset = generic_inlineformset_factory(Media, exclude=("url",))

        # Regression test for #12340.
        e = Episode.objects.get(name="This Week in Django")
        formset = inline_formset(instance=e)
        self.assertTrue(formset.get_queryset().ordered)
Beispiel #12
0
 def test_generic_inlineformset_factory(self):
     """
     Regression for #14572: Using base forms with widgets
     defined in Meta should not raise errors.
     """
     Formset = generic_inlineformset_factory(TaggedItem, TaggedItemForm)
     form = Formset().forms[0]
     self.assertIsInstance(form['tag'].field.widget, CustomWidget)
Beispiel #13
0
 def test_get_queryset_ordering(self):
     """
     BaseGenericInlineFormSet.get_queryset() adds default ordering, if
     needed.
     """
     inline_formset = generic_inlineformset_factory(TaggedItem,
                                                    exclude=('tag', ))
     formset = inline_formset(instance=Gecko.objects.create())
     self.assertIs(formset.get_queryset().ordered, True)
Beispiel #14
0
    def test_generic_inline_formset_factory(self):
        # Regression test for #10522.
        inline_formset = generic_inlineformset_factory(Media,
            exclude=('url',))

        # Regression test for #12340.
        e = Episode.objects.get(name='This Week in Django')
        formset = inline_formset(instance=e)
        self.assertTrue(formset.get_queryset().ordered)
Beispiel #15
0
 def test_initial_count(self):
     GenericFormSet = generic_inlineformset_factory(TaggedItem)
     data = {
         'form-TOTAL_FORMS': '3',
         'form-INITIAL_FORMS': '3',
         'form-MAX_NUM_FORMS': '',
     }
     formset = GenericFormSet(data=data, prefix='form')
     self.assertEqual(formset.initial_form_count(), 3)
     formset = GenericFormSet(data=data, prefix='form', save_as_new=True)
     self.assertEqual(formset.initial_form_count(), 0)
Beispiel #16
0
 def test_initial(self):
     quartz = Mineral.objects.create(name='Quartz', hardness=7)
     GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
     ctype = ContentType.objects.get_for_model(quartz)
     initial_data = [{
         'tag': 'lizard',
         'content_type': ctype.pk,
         'object_id': quartz.pk,
     }]
     formset = GenericFormSet(initial=initial_data)
     self.assertEqual(formset.forms[0].initial, initial_data[0])
Beispiel #17
0
 def test_disable_delete_extra(self):
     GenericFormSet = generic_inlineformset_factory(
         TaggedItem,
         can_delete=True,
         can_delete_extra=False,
         extra=2,
     )
     formset = GenericFormSet()
     self.assertEqual(len(formset), 2)
     self.assertNotIn("DELETE", formset.forms[0].fields)
     self.assertNotIn("DELETE", formset.forms[1].fields)
Beispiel #18
0
    def test_generic_inline_formsets_initial(self):
        """
        Test for #17927 Initial values support for BaseGenericInlineFormSet.
        """
        quartz = Mineral.objects.create(name="Quartz", hardness=7)

        GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
        ctype = ContentType.objects.get_for_model(quartz)
        initial_data = [{"tag": "lizard", "content_type": ctype.pk, "object_id": quartz.pk}]
        formset = GenericFormSet(initial=initial_data)
        self.assertEqual(formset.forms[0].initial, initial_data[0])
Beispiel #19
0
 def test_initial(self):
     quartz = Mineral.objects.create(name="Quartz", hardness=7)
     GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
     ctype = ContentType.objects.get_for_model(quartz)
     initial_data = [{
         "tag": "lizard",
         "content_type": ctype.pk,
         "object_id": quartz.pk,
     }]
     formset = GenericFormSet(initial=initial_data)
     self.assertEqual(formset.forms[0].initial, initial_data[0])
Beispiel #20
0
 def test_initial_count(self):
     GenericFormSet = generic_inlineformset_factory(TaggedItem)
     data = {
         'form-TOTAL_FORMS': '3',
         'form-INITIAL_FORMS': '3',
         'form-MAX_NUM_FORMS': '',
     }
     formset = GenericFormSet(data=data, prefix='form')
     self.assertEqual(formset.initial_form_count(), 3)
     formset = GenericFormSet(data=data, prefix='form', save_as_new=True)
     self.assertEqual(formset.initial_form_count(), 0)
Beispiel #21
0
 def test_initial(self):
     quartz = Mineral.objects.create(name='Quartz', hardness=7)
     GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
     ctype = ContentType.objects.get_for_model(quartz)
     initial_data = [{
         'tag': 'lizard',
         'content_type': ctype.pk,
         'object_id': quartz.pk,
     }]
     formset = GenericFormSet(initial=initial_data)
     self.assertEqual(formset.forms[0].initial, initial_data[0])
Beispiel #22
0
def ko_generic_inlineformset_factory(model, form, **kwargs):
    if isinstance(form, DisplayModelMetaclass):
        kwargs.update({
            'extra': 0,
            'can_delete': False
        })
    formset = generic_inlineformset_factory(model, form, **kwargs)
    formset.set_knockout_template = set_empty_template \
        if isinstance(form, DisplayModelMetaclass) \
        else set_knockout_template
    return formset
Beispiel #23
0
    def test_generic_inline_formset(self):
        EpisodeMediaFormSet = generic_inlineformset_factory(
            Media, can_delete=False, exclude=["description", "keywords"], extra=3
        )
        e = Episode.objects.get(name="This Week in Django")

        # Works with no queryset
        formset = EpisodeMediaFormSet(instance=e)
        self.assertEqual(len(formset.forms), 5)
        self.assertHTMLEqual(
            formset.forms[0].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="url" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>'
            % self.mp3_media_pk,
        )
        self.assertHTMLEqual(
            formset.forms[1].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="url" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>'
            % self.png_media_pk,
        )
        self.assertHTMLEqual(
            formset.forms[2].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="url" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>',
        )

        # A queryset can be used to alter display ordering
        formset = EpisodeMediaFormSet(instance=e, queryset=Media.objects.order_by("url"))
        self.assertEqual(len(formset.forms), 5)
        self.assertHTMLEqual(
            formset.forms[0].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="url" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>'
            % self.png_media_pk,
        )
        self.assertHTMLEqual(
            formset.forms[1].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="url" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>'
            % self.mp3_media_pk,
        )
        self.assertHTMLEqual(
            formset.forms[2].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="url" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>',
        )

        # Works with a queryset that omits items
        formset = EpisodeMediaFormSet(instance=e, queryset=Media.objects.filter(url__endswith=".png"))
        self.assertEqual(len(formset.forms), 4)
        self.assertHTMLEqual(
            formset.forms[0].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="url" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>'
            % self.png_media_pk,
        )
        self.assertHTMLEqual(
            formset.forms[1].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="url" name="generic_inline_admin-media-content_type-object_id-1-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>',
        )
Beispiel #24
0
    def test_generic_inline_formset(self):
        EpisodeMediaFormSet = generic_inlineformset_factory(
            Media,
            can_delete=False,
            exclude=['description', 'keywords'],
            extra=3)
        e = Episode.objects.get(name='This Week in Django')

        # Works with no queryset
        formset = EpisodeMediaFormSet(instance=e)
        self.assertEqual(len(formset.forms), 5)
        self.assertHTMLEqual(
            formset.forms[0].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="url" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>'
            % self.mp3_media_pk)
        self.assertHTMLEqual(
            formset.forms[1].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="url" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>'
            % self.png_media_pk)
        self.assertHTMLEqual(
            formset.forms[2].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="url" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>'
        )

        # A queryset can be used to alter display ordering
        formset = EpisodeMediaFormSet(instance=e,
                                      queryset=Media.objects.order_by('url'))
        self.assertEqual(len(formset.forms), 5)
        self.assertHTMLEqual(
            formset.forms[0].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="url" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>'
            % self.png_media_pk)
        self.assertHTMLEqual(
            formset.forms[1].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="url" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>'
            % self.mp3_media_pk)
        self.assertHTMLEqual(
            formset.forms[2].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="url" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>'
        )

        # Works with a queryset that omits items
        formset = EpisodeMediaFormSet(
            instance=e, queryset=Media.objects.filter(url__endswith=".png"))
        self.assertEqual(len(formset.forms), 4)
        self.assertHTMLEqual(
            formset.forms[0].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="url" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>'
            % self.png_media_pk)
        self.assertHTMLEqual(
            formset.forms[1].as_p(),
            '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="url" name="generic_inline_admin-media-content_type-object_id-1-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>'
        )
Beispiel #25
0
    def test_save_new_for_concrete(self):
        Formset = generic_inlineformset_factory(ForProxyModelModel, fields="__all__", for_concrete_model=True)

        instance = ProxyRelatedModel.objects.create()

        data = {"form-TOTAL_FORMS": "1", "form-INITIAL_FORMS": "0", "form-MAX_NUM_FORMS": "", "form-0-title": "foo"}

        formset = Formset(data, instance=instance, prefix="form")
        self.assertTrue(formset.is_valid())

        new_obj, = formset.save()
        self.assertNotIsInstance(new_obj.obj, ProxyRelatedModel)
 def test_save_new_for_concrete(self):
     Formset = generic_inlineformset_factory(ForProxyModelModel, fields='__all__', for_concrete_model=True)
     instance = ProxyRelatedModel.objects.create()
     data = {
         'form-TOTAL_FORMS': '1',
         'form-INITIAL_FORMS': '0',
         'form-MAX_NUM_FORMS': '',
         'form-0-title': 'foo',
     }
     formset = Formset(data, instance=instance, prefix='form')
     self.assertTrue(formset.is_valid())
     new_obj, = formset.save()
     self.assertNotIsInstance(new_obj.obj, ProxyRelatedModel)
Beispiel #27
0
 def test_save_new_for_concrete(self):
     Formset = generic_inlineformset_factory(ForProxyModelModel, fields='__all__', for_concrete_model=True)
     instance = ProxyRelatedModel.objects.create()
     data = {
         'form-TOTAL_FORMS': '1',
         'form-INITIAL_FORMS': '0',
         'form-MAX_NUM_FORMS': '',
         'form-0-title': 'foo',
     }
     formset = Formset(data, instance=instance, prefix='form')
     self.assertTrue(formset.is_valid())
     new_obj, = formset.save()
     self.assertNotIsInstance(new_obj.obj, ProxyRelatedModel)
Beispiel #28
0
    def get_formset(self, request, obj=None, **kwargs):
        if 'fields' in kwargs:
            fields = kwargs.pop('fields')
        else:
            fields = flatten_fieldsets(self.get_fieldsets(request, obj))
        if self.exclude is None:
            exclude = []
        else:
            exclude = list(self.exclude)
        exclude.extend(self.get_readonly_fields(request, obj))
        if self.exclude is None and hasattr(
                self.form, '_meta') and self.form._meta.exclude:
            # Take the custom ModelForm's Meta.exclude into account only if the
            # GenericInlineModelAdmin doesn't define its own.
            exclude.extend(self.form._meta.exclude)
        exclude = exclude or None
        can_delete = self.can_delete and self.has_delete_permission(
            request, obj)
        defaults = {
            "ct_field":
            self.ct_field,
            "fk_field":
            self.ct_fk_field,
            "form":
            self.form,
            "formfield_callback":
            partial(self.formfield_for_dbfield, request=request),
            "formset":
            self.formset,
            "extra":
            self.get_extra(request, obj),
            "can_delete":
            can_delete,
            "can_order":
            False,
            "fields":
            fields,
            "min_num":
            self.get_min_num(request, obj),
            "max_num":
            self.get_max_num(request, obj),
            "exclude":
            exclude
        }
        defaults.update(kwargs)

        if defaults['fields'] is None and not modelform_defines_fields(
                defaults['form']):
            defaults['fields'] = ALL_FIELDS

        return generic_inlineformset_factory(self.model, **defaults)
Beispiel #29
0
    def test_generic_inline_formsets(self):
        GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
        formset = GenericFormSet()
        self.assertHTMLEqual(
            ''.join(form.as_p() for form in formset.forms),
            """<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p>"""
        )

        formset = GenericFormSet(instance=Animal())
        self.assertHTMLEqual(
            ''.join(form.as_p() for form in formset.forms),
            """<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p>"""
        )

        platypus = Animal.objects.create(common_name="Platypus",
                                         latin_name="Ornithorhynchus anatinus")
        platypus.tags.create(tag="shiny")
        GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
        formset = GenericFormSet(instance=platypus)
        tagged_item_id = TaggedItem.objects.get(tag='shiny',
                                                object_id=platypus.id).id
        self.assertHTMLEqual(
            ''.join(form.as_p() for form in formset.forms),
            """<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" value="shiny" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" value="%s" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p><p><label for="id_generic_relations-taggeditem-content_type-object_id-1-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-1-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-1-tag" maxlength="50" /></p>
<p><label for="id_generic_relations-taggeditem-content_type-object_id-1-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-1-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-1-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-1-id" id="id_generic_relations-taggeditem-content_type-object_id-1-id" /></p>"""
            % tagged_item_id)

        lion = Animal.objects.create(common_name="Lion",
                                     latin_name="Panthera leo")
        formset = GenericFormSet(instance=lion, prefix='x')
        self.assertHTMLEqual(
            ''.join(form.as_p() for form in formset.forms),
            """<p><label for="id_x-0-tag">Tag:</label> <input id="id_x-0-tag" type="text" name="x-0-tag" maxlength="50" /></p>
<p><label for="id_x-0-DELETE">Delete:</label> <input type="checkbox" name="x-0-DELETE" id="id_x-0-DELETE" /><input type="hidden" name="x-0-id" id="id_x-0-id" /></p>"""
        )
Beispiel #30
0
    def get_formset(self, request, obj=None, **kwargs):
        if 'fields' in kwargs:
            fields = kwargs.pop('fields')
        else:
            fields = flatten_fieldsets(self.get_fieldsets(request, obj))
        exclude = [
            *(self.exclude or []), *self.get_readonly_fields(request, obj)
        ]
        if self.exclude is None and hasattr(
                self.form, '_meta') and self.form._meta.exclude:
            # Take the custom ModelForm's Meta.exclude into account only if the
            # GenericInlineModelAdmin doesn't define its own.
            exclude.extend(self.form._meta.exclude)
        exclude = exclude or None
        can_delete = self.can_delete and self.has_delete_permission(
            request, obj)
        defaults = {
            'ct_field':
            self.ct_field,
            'fk_field':
            self.ct_fk_field,
            'form':
            self.form,
            'formfield_callback':
            partial(self.formfield_for_dbfield, request=request),
            'formset':
            self.formset,
            'extra':
            self.get_extra(request, obj),
            'can_delete':
            can_delete,
            'can_order':
            False,
            'fields':
            fields,
            'min_num':
            self.get_min_num(request, obj),
            'max_num':
            self.get_max_num(request, obj),
            'exclude':
            exclude,
            **kwargs,
        }

        if defaults['fields'] is None and not modelform_defines_fields(
                defaults['form']):
            defaults['fields'] = ALL_FIELDS

        return generic_inlineformset_factory(self.model, **defaults)
Beispiel #31
0
 def test_absolute_max(self):
     GenericFormSet = generic_inlineformset_factory(TaggedItem,
                                                    absolute_max=1500)
     data = {
         "form-TOTAL_FORMS": "1501",
         "form-INITIAL_FORMS": "0",
         "form-MAX_NUM_FORMS": "0",
     }
     formset = GenericFormSet(data=data, prefix="form")
     self.assertIs(formset.is_valid(), False)
     self.assertEqual(len(formset.forms), 1500)
     self.assertEqual(
         formset.non_form_errors(),
         ["Please submit at most 1000 forms."],
     )
Beispiel #32
0
 def test_save_new_for_concrete(self):
     Formset = generic_inlineformset_factory(ForProxyModelModel,
                                             fields="__all__",
                                             for_concrete_model=True)
     instance = ProxyRelatedModel.objects.create()
     data = {
         "form-TOTAL_FORMS": "1",
         "form-INITIAL_FORMS": "0",
         "form-MAX_NUM_FORMS": "",
         "form-0-title": "foo",
     }
     formset = Formset(data, instance=instance, prefix="form")
     self.assertTrue(formset.is_valid())
     (new_obj, ) = formset.save()
     self.assertNotIsInstance(new_obj.obj, ProxyRelatedModel)
Beispiel #33
0
 def test_absolute_max(self):
     GenericFormSet = generic_inlineformset_factory(TaggedItem,
                                                    absolute_max=1500)
     data = {
         'form-TOTAL_FORMS': '1501',
         'form-INITIAL_FORMS': '0',
         'form-MAX_NUM_FORMS': '0',
     }
     formset = GenericFormSet(data=data, prefix='form')
     self.assertIs(formset.is_valid(), False)
     self.assertEqual(len(formset.forms), 1500)
     self.assertEqual(
         formset.non_form_errors(),
         ['Please submit 1000 or fewer forms.'],
     )
Beispiel #34
0
    def test_generic_inline_formsets_initial(self):
        """
        Test for #17927 Initial values support for BaseGenericInlineFormSet.
        """
        quartz = Mineral.objects.create(name="Quartz", hardness=7)

        GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1)
        ctype = ContentType.objects.get_for_model(quartz)
        initial_data = [{
            'tag': 'lizard',
            'content_type': ctype.pk,
            'object_id': quartz.pk,
        }]
        formset = GenericFormSet(initial=initial_data)
        self.assertEqual(formset.forms[0].initial, initial_data[0])
Beispiel #35
0
def _generate_formset_class(
    request, model, modelfield, baseformclass, formsetfieldelement
):
    """Returns a FormSet class which handles inline forms correctly."""

    formfieldelements = _get_form_fields_from_layout(
        _layout.BaseElement(*formsetfieldelement)
    )  # make sure the _layout.form.FormSetField does not be considered recursively

    formclass = breadmodelform_factory(
        request=request,
        model=modelfield.related_model,
        layout=formfieldelements,
        instance=None,
        baseformclass=baseformclass,
    )

    base_formset_kwargs = {
        "fields": [
            formfieldelement.fieldname for formfieldelement in formfieldelements
        ],
        "form": formclass,
        "extra": 0,
        "can_delete": True,
    }
    base_formset_kwargs.update(formsetfieldelement.formsetfactory_kwargs)
    if isinstance(modelfield, GenericRelation):
        return generic_inlineformset_factory(
            modelfield.related_model,
            ct_field=modelfield.content_type_field_name,
            fk_field=modelfield.object_id_field_name,
            formset=InlineFormSetWithLimits,
            formfield_callback=lambda field: _formfield_callback_with_request(
                field, request, modelfield.related_model
            ),
            **base_formset_kwargs,
        )
    else:
        return forms.models.inlineformset_factory(
            model,
            modelfield.related_model,
            formset=InlineFormSetWithLimits,
            formfield_callback=lambda field: _formfield_callback_with_request(
                field, request, model
            ),
            **base_formset_kwargs,
        )
    def test_save_new_uses_form_save(self):
        class SaveTestForm(forms.ModelForm):
            def save(self, *args, **kwargs):
                self.instance.saved_by = 'custom method'
                return super().save(*args, **kwargs)

        Formset = generic_inlineformset_factory(ForProxyModelModel, fields='__all__', form=SaveTestForm)
        instance = ProxyRelatedModel.objects.create()
        data = {
            'form-TOTAL_FORMS': '1',
            'form-INITIAL_FORMS': '0',
            'form-MAX_NUM_FORMS': '',
            'form-0-title': 'foo',
        }
        formset = Formset(data, instance=instance, prefix='form')
        self.assertTrue(formset.is_valid())
        new_obj = formset.save()[0]
        self.assertEqual(new_obj.saved_by, 'custom method')
Beispiel #37
0
    def test_save_new_uses_form_save(self):
        class SaveTestForm(forms.ModelForm):
            def save(self, *args, **kwargs):
                self.instance.saved_by = "custom method"
                return super().save(*args, **kwargs)

        Formset = generic_inlineformset_factory(ForProxyModelModel,
                                                fields="__all__",
                                                form=SaveTestForm)
        instance = ProxyRelatedModel.objects.create()
        data = {
            "form-TOTAL_FORMS": "1",
            "form-INITIAL_FORMS": "0",
            "form-MAX_NUM_FORMS": "",
            "form-0-title": "foo",
        }
        formset = Formset(data, instance=instance, prefix="form")
        self.assertTrue(formset.is_valid())
        new_obj = formset.save()[0]
        self.assertEqual(new_obj.saved_by, "custom method")
Beispiel #38
0
            def get_formset(self, request, obj=None, **kwargs):
                if self.declared_fieldsets:
                    fields = flatten_fieldsets(self.declared_fieldsets)
                else:
                    fields = None
                if self.exclude is None:
                    exclude = []
                else:
                    exclude = list(self.exclude)
                exclude.extend(self.get_readonly_fields(request, obj))
                exclude = exclude or None

                if not hasattr(self, 'ct_fk_field'):
                    return super(cls, self).get_formset(request, obj, **kwargs)
                else:
                    # TODO:
                    # this code can be deleted if django fixes GenericInlineModelAdmin it's
                    # get_formset signature so it looks like InlineModelAdmin
                    defaults = {
                        "ct_field": self.ct_field,
                        "fk_field": self.ct_fk_field,
                        "form": self.form,
                        "formfield_callback": self.formfield_for_dbfield,
                        "formset": self.formset,
                        "extra": self.extra,
                        "can_delete": self.can_delete,
                        "can_order": False,
                        "fields": fields,
                        "max_num": self.max_num,
                        "exclude": exclude
                    }

                    defaults.update(kwargs)
                    # the BaseGenericInlineFormSet does not work too well
                    # with modified models, so use LocalizableGenericInlineFormSet.
                    if self.formset is BaseGenericInlineFormSet \
                        or self.formset.__class__ is BaseGenericInlineFormSet:
                        defaults['formset'] = LocalizableGenericInlineFormSet

                    return generic_inlineformset_factory(
                        self.model, **defaults)
Beispiel #39
0
 def test_options(self):
     TaggedItemFormSet = generic_inlineformset_factory(
         TaggedItem,
         can_delete=False,
         exclude=["tag"],
         extra=3,
     )
     platypus = Animal.objects.create(common_name="Platypus",
                                      latin_name="Ornithorhynchus anatinus")
     harmless = platypus.tags.create(tag="harmless")
     mammal = platypus.tags.create(tag="mammal")
     # Works without a queryset.
     formset = TaggedItemFormSet(instance=platypus)
     self.assertEqual(len(formset.forms), 5)
     self.assertHTMLEqual(
         formset.forms[0].as_p(),
         '<input type="hidden" '
         'name="generic_relations-taggeditem-content_type-object_id-0-id" '
         'value="%s" '
         'id="id_generic_relations-taggeditem-content_type-object_id-0-id">'
         % harmless.pk,
     )
     self.assertEqual(formset.forms[0].instance, harmless)
     self.assertEqual(formset.forms[1].instance, mammal)
     self.assertIsNone(formset.forms[2].instance.pk)
     # A queryset can be used to alter display ordering.
     formset = TaggedItemFormSet(
         instance=platypus, queryset=TaggedItem.objects.order_by("-tag"))
     self.assertEqual(len(formset.forms), 5)
     self.assertEqual(formset.forms[0].instance, mammal)
     self.assertEqual(formset.forms[1].instance, harmless)
     self.assertIsNone(formset.forms[2].instance.pk)
     # A queryset that omits items.
     formset = TaggedItemFormSet(
         instance=platypus,
         queryset=TaggedItem.objects.filter(tag__startswith="harm"),
     )
     self.assertEqual(len(formset.forms), 4)
     self.assertEqual(formset.forms[0].instance, harmless)
     self.assertIsNone(formset.forms[1].instance.pk)
Beispiel #40
0
def subtype_inlineformset_factory(
        parent_model, model, form=ModelForm,
        formset=ct_forms.BaseGenericInlineFormSet, fk_name=None, fields=None,
        exclude=None, extra=3, can_order=False, can_delete=True, max_num=None,
        formfield_callback=None, validate_max=False, for_concrete_model=True):
    """
    Returns a ``GenericInlineFormSet`` for the given kwargs.

    The ``ct_field`` and ``fk_field`` are determined by the
    ``BaseTypeForeignKey`` that provides the relationship between
    ``parent_model`` and model.

    If ``model`` has more than one ``BaseTypeForeignKey`` to ``parent_model``,
    you must provide ``fk_name``.
    """
    fk = get_basetype_foreign_key(parent_model, model, fk_name=fk_name)
    return ct_forms.generic_inlineformset_factory(
        model, form, formset=formset, ct_field=fk.ct_field,
        fk_field=fk.fk_field, fields=fields, exclude=exclude, extra=extra,
        can_order=can_order, can_delete=can_delete, max_num=max_num,
        formfield_callback=formfield_callback, validate_max=validate_max,
        for_concrete_model=for_concrete_model)
Beispiel #41
0
 def test_save_as_new(self):
     """
     The save_as_new parameter creates new items that are associated with
     the object.
     """
     lion = Animal.objects.create(common_name='Lion', latin_name='Panthera leo')
     yellow = lion.tags.create(tag='yellow')
     hairy = lion.tags.create(tag='hairy')
     GenericFormSet = generic_inlineformset_factory(TaggedItem)
     data = {
         'form-TOTAL_FORMS': '3',
         'form-INITIAL_FORMS': '2',
         'form-MAX_NUM_FORMS': '',
         'form-0-id': str(yellow.pk),
         'form-0-tag': 'hunts',
         'form-1-id': str(hairy.pk),
         'form-1-tag': 'roars',
     }
     formset = GenericFormSet(data, instance=lion, prefix='form', save_as_new=True)
     self.assertTrue(formset.is_valid())
     tags = formset.save()
     self.assertEqual([tag.tag for tag in tags], ['hunts', 'roars'])
     hunts, roars = tags
     self.assertSequenceEqual(lion.tags.order_by('tag'), [hairy, hunts, roars, yellow])
 def test_save_as_new(self):
     """
     The save_as_new parameter creates new items that are associated with
     the object.
     """
     lion = Animal.objects.create(common_name='Lion', latin_name='Panthera leo')
     yellow = lion.tags.create(tag='yellow')
     hairy = lion.tags.create(tag='hairy')
     GenericFormSet = generic_inlineformset_factory(TaggedItem)
     data = {
         'form-TOTAL_FORMS': '3',
         'form-INITIAL_FORMS': '2',
         'form-MAX_NUM_FORMS': '',
         'form-0-id': str(yellow.pk),
         'form-0-tag': 'hunts',
         'form-1-id': str(hairy.pk),
         'form-1-tag': 'roars',
     }
     formset = GenericFormSet(data, instance=lion, prefix='form', save_as_new=True)
     self.assertTrue(formset.is_valid())
     tags = formset.save()
     self.assertEqual([tag.tag for tag in tags], ['hunts', 'roars'])
     hunts, roars = tags
     self.assertSequenceEqual(lion.tags.order_by('tag'), [hairy, hunts, roars, yellow])
Beispiel #43
0
    def get_queryset(self):
        queryset = Ticket.objects.all()
        filters = self.filter.get_filters()
        if filters:
            queryset = queryset.filter(**filters)
        if self.search:
            keywords = [w for w in self.search.split(' ') if w]
            print(keywords)
            qs = Q()
            for word in keywords:
                qs |= Q(customer__icontains=word) | Q(title__icontains=word) | Q(body__icontains=word)
            queryset = queryset.filter(qs)
        return queryset.order_by('-updated')


AttachmentFormset = generic_inlineformset_factory(MailAttachment, can_delete=False, extra=3)


class TicketCreateView(CreateView):
    model = Ticket
    template_name = 'helpdesk/ticket_create.html'
    form_class = TicketCreateForm
    attachment_formset = None

    def dispatch(self, request, *args, **kwargs):
        self.attachment_formset = AttachmentFormset(data=request.POST or None, files=request.FILES or None)
        return super(TicketCreateView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        if not self.attachment_formset.is_valid():
            return self.render_to_response(self.get_context_data())
Beispiel #44
0
class ReCommentCreateForm(forms.ModelForm):
    """返信コメント投稿フォーム"""

    captha = SimpleCaptchaField(
        widget=forms.TextInput(attrs={'class': 'form-control'}), )

    class Meta:
        model = ReComment
        fields = ('name', 'text', 'icon')
        widgets = {
            'name':
            forms.TextInput(attrs={
                'class': "form-control",
            }),
            'text':
            forms.Textarea(attrs={
                'class': "form-control",
            }),
            'icon':
            forms.ClearableFileInput(attrs={
                'class': "form-control-file",
            }),
        }


FileInlineFormSet = generic_inlineformset_factory(
    File,
    fields=('src', ),
    can_delete=False,
    extra=1,
)
 def get_formset(self):
     """
     Returns the final formset class from generic_inlineformset_factory.
     """
     result = generic_inlineformset_factory(self.inline_model, **self.get_factory_kwargs())
     return result
Beispiel #46
0
 def test_meta_widgets(self):
     """TaggedItemForm has a widget defined in Meta."""
     Formset = generic_inlineformset_factory(TaggedItem, TaggedItemForm)
     form = Formset().forms[0]
     self.assertIsInstance(form['tag'].field.widget, CustomWidget)
Beispiel #47
0
from django.contrib.contenttypes.forms import (
    BaseGenericInlineFormSet,
    generic_inlineformset_factory,
)
from django.forms import ModelForm, TextInput

from comicsdb.models.attribution import Attribution


class AttributionForm(ModelForm):
    class Meta:
        model = Attribution
        fields = "__all__"
        widgets = {
            "url": TextInput(attrs={"class": "input"}),
        }


AttributionFormSet = generic_inlineformset_factory(
    Attribution,
    AttributionForm,
    BaseGenericInlineFormSet,
    can_delete=True,
    extra=1,
)
Beispiel #48
0
 def test_meta_widgets(self):
     """TaggedItemForm has a widget defined in Meta."""
     Formset = generic_inlineformset_factory(TaggedItem, TaggedItemForm)
     form = Formset().forms[0]
     self.assertIsInstance(form['tag'].field.widget, CustomWidget)
Beispiel #49
0
class SkillForm(forms.ModelForm):
    """
    Handle adding skills.

    The form will allow users to add the skill to multiple headers at multiple
    different costs.
    """
    class Media:
        js = (
            'js/lib/jquery.formset.js',
            'js/lib/jquery-ui.min.js',
        )

    class Meta:
        model = Skill
        fields = INCLUDE_FOR_EDIT_SKILL


HeaderSkillFormSet = forms.inlineformset_factory(
    Skill,
    HeaderSkill,
    fields=('header', 'cost', 'dabble_flag', 'capstone_flag', 'magic_flag'),
    extra=1,
    can_delete=True)

RuleFormSet = generic_inlineformset_factory(Rule,
                                            fields='__all__',
                                            extra=1,
                                            can_delete=True)
Beispiel #50
0
        instance = getattr(self, 'instance', None)
        self.fields['service'].widget.instance = instance
        if instance and instance.id:
            self.fields['service'].widget.attrs['readonly'] = True

    def clean_service(self):
        return self.instance.service

    service = forms.CharField(label='', widget=ReadOnlyIconField(), required=False)
    url = forms.URLField(label=_('Website / URL'), required=False)


# Compose Formsets
MediaRelationFormSet = generic_inlineformset_factory(Relation,
                                                     form=BaseMediaReleationForm,
                                                     formset=BaseMediaReleationFormSet,
                                                     extra=15, exclude=('action',),
                                                     can_delete=True)

MediaartistFormSet = inlineformset_factory(Media,
                                           MediaArtists,
                                           form=BaseMediaartistForm,
                                           formset=BaseMediaartistFormSet,
                                           extra=15,
                                           exclude=('position',),
                                           can_delete=True,
                                           can_order=False, )

ExtraartistFormSet = inlineformset_factory(Media,
                                           MediaExtraartists,
                                           form=BaseExtraartistForm,
Beispiel #51
0
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS, FieldError
from django.core.urlresolvers import reverse_lazy
from django.contrib import messages

from .models import Task, TaskFile, TaskTemplate
from .forms import TasksListFilters, TaskFileForm
from app.task import forms as task_forms
from app.core.models import FileItem
from app.core.forms import FileItemForm
from .signals import task_saved


FilesFormset = generic_inlineformset_factory(
    FileItem,
    form=FileItemForm,
    ct_field='owner_type',
    fk_field='owner_id',
    fields=['file'],
    extra=0,
)


class TasksList(AjaxListView):
    model = Task
    template_name = 'task/tasks_list_page.html'
    context_object_name = 'tasks'
    # TODO создать кастомый queryset
    # queryset = Task.objects.filter(deleted=False)
    filters_form_class = TasksListFilters
    LIST_MY_TODAY = 'my-today'
    LIST_MY_TOMORROW = 'my-tomorrow'
    LIST_MY_OVERDUE = 'my-overdue'
Beispiel #52
0
        parent_model = Label
        formset = BaseLabelReleationFormSet
        fields = (
            'url',
            'service',
        )

    def __init__(self, *args, **kwargs):
        super(BaseLabelReleationForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        self.fields['service'].widget.instance = instance
        if instance and instance.id:
            self.fields['service'].widget.attrs['readonly'] = True

    def clean_service(self):
        return self.instance.service

    service = forms.CharField(label='',
                              widget=ReadOnlyIconField(),
                              required=False)
    url = forms.URLField(label=_('Website / URL'), required=False)


LabelRelationFormSet = generic_inlineformset_factory(
    Relation,
    form=BaseLabelReleationForm,
    formset=BaseLabelReleationFormSet,
    extra=15,
    exclude=('action', ),
    can_delete=True)
Beispiel #53
0
        return (
            self.field.prepare_value(obj),
            self.field.label_from_instance(obj),
            obj
        )


class EarthTechniqueMultipleChoiceField(ModelMultipleChoiceField):
    def __init__(self, *args, **kwargs):
        super(EarthTechniqueMultipleChoiceField, self).__init__(
            *args, **kwargs
        )
        self.choices = EarthTechniqueChoiceIterator(self)


ImageFormSet = generic_inlineformset_factory(Image, extra=1, can_delete=True)


class GeoDataAbstractForm(ModelForm):
    geometry = PointField(widget=GeoDataWidget())
    # geometry = forms.CharField(widget=GeodataWidget())
    # def clean(self):
    #     super(MapModelForm, self).clean()
    #
    #     if not self.cleaned_data['geometry']:
    #         if self.cleaned_data['image']:
    #             im = Image.open(self.cleaned_data['image'])
    #             gps_data = _get_exifgps(im)
    #             longitude = gps_data['longitude']
    #             latitude = gps_data['latitude']
    #             if longitude and latitude:
Beispiel #54
0
from django import forms
from django.contrib.contenttypes.forms import generic_inlineformset_factory
from media_objects.models import Image,Document
from levantamiento.models import Levantamiento


class InlineImageForm(forms.ModelForm):
	class Meta:
		model = Image
		fields = ("img",)

class InlineDocumentForm(forms.ModelForm):
	class Meta:
		model = Document
		fields = ("doc",)

ImageFormSet = generic_inlineformset_factory(Image,form=InlineImageForm,extra=1,can_delete=False)
DocumentFormSet = generic_inlineformset_factory(Document,form=InlineDocumentForm,extra=1,can_delete=False)
Beispiel #55
0

class FileAttachmentForm(forms.ModelForm):
    """A model form for FileAttachments."""

    class Meta:
        """Class options."""

        model = cons_models.FileAttachment
        exclude = ()
        widgets = {
            "author": usr_widgets.UserWidget(),
        }

FileAttachmentFormSet = generic_inlineformset_factory(
    cons_models.FileAttachment, form=FileAttachmentForm, extra=1
)


class FileAttachmentFormSetHelper(FormHelper):
    """FileAttachmentFormSetHelper."""

    def __init__(self, *args, **kwargs):
        """Init."""
        super(FileAttachmentFormSetHelper, self).__init__(*args, **kwargs)
        self.form_method = 'post'
        self.layout = Layout(
            Fieldset(
                'File attachment',
                Div(
                    Div('attachment', css_class="col col-lg-3 col-md-6 col-12"),
Beispiel #56
0
        if suma != total_en_acta:
            #form_opcion_total.add_error(
            #    'votos', 'La sumatoria no se corresponde con el total'
            #)
            self.warnings.append((form_opcion_total, 'votos', 'La sumatoria no se corresponde con el total'))

        if cantidad_sobres != total_en_acta:
            # form_opcion_total.add_error(
            #    'votos', 'El total no corresponde a la cantidad de sobres'
            # )
            self.warnings.append((form_opcion_total, 'votos', 'El total no corresponde a la cantidad de sobres'))
        """


VotoMesaReportadoFormset = modelformset_factory(
    VotoMesaReportado,
    form=VotoMesaModelForm,
    formset=BaseVotoMesaReportadoFormSet,
    min_num=opciones_actuales(),
    extra=0,
    can_delete=False)

ContactoInlineFormset = generic_inlineformset_factory(
    DatoDeContacto, form=DatoDeContactoModelForm, can_delete=True)

ActaMesaModelForm = modelform_factory(
    Mesa,
    fields=['foto_acta'],
)
Beispiel #57
0
        super().__init__(*args, **kwargs)

        if self.instance.pk and self.instance.start_date and self.instance.end_date:
            self.initial['start_date'] = self.instance.start_date.strftime(
                '%d/%m/%Y')
            self.initial['end_date'] = self.instance.end_date.strftime(
                '%d/%m/%Y')

    def clean(self):
        cleaned_data = super().clean()
        start_date = cleaned_data.get("start_date")
        end_date = cleaned_data.get("end_date")

        if start_date and end_date and start_date > end_date:
            self.add_error(
                'start_date',
                _('Starting date should be earlier than ending date'))

    class Meta:
        model = Tender
        fields = ('title', 'content', 'keywords', 'currency', 'cost',
                  'country', 'branches')


AdditionalPageFormSet = generic_inlineformset_factory(AdditionalPage,
                                                      fields=('title',
                                                              'content'),
                                                      max_num=5,
                                                      validate_max=True,
                                                      extra=0)
Beispiel #58
0
def generic_polymorphic_inlineformset_factory(
        model,
        formset_children,
        form=ModelForm,
        formset=BaseGenericPolymorphicInlineFormSet,
        ct_field="content_type",
        fk_field="object_id",
        # Base form
        # TODO: should these fields be removed in favor of creating
        # the base form as a formset child too?
        fields=None,
        exclude=None,
        extra=1,
        can_order=False,
        can_delete=True,
        max_num=None,
        formfield_callback=None,
        validate_max=False,
        for_concrete_model=True,
        min_num=None,
        validate_min=False,
        child_form_kwargs=None):
    """
    Construct the class for a generic inline polymorphic formset.

    All arguments are identical to :func:`~django.contrib.contenttypes.forms.generic_inlineformset_factory`,
    with the exception of the ``formset_children`` argument.

    :param formset_children: A list of all child :class:`PolymorphicFormSetChild` objects
                             that tell the inline how to render the child model types.
    :type formset_children: Iterable[PolymorphicFormSetChild]
    :rtype: type
    """
    kwargs = {
        'model': model,
        'form': form,
        'formfield_callback': formfield_callback,
        'formset': formset,
        'ct_field': ct_field,
        'fk_field': fk_field,
        'extra': extra,
        'can_delete': can_delete,
        'can_order': can_order,
        'fields': fields,
        'exclude': exclude,
        'min_num': min_num,
        'max_num': max_num,
        'validate_min': validate_min,
        'validate_max': validate_max,
        'for_concrete_model': for_concrete_model,
        # 'localized_fields': localized_fields,
        # 'labels': labels,
        # 'help_texts': help_texts,
        # 'error_messages': error_messages,
        # 'field_classes': field_classes,
    }
    if child_form_kwargs is None:
        child_form_kwargs = {}

    child_kwargs = {
        # 'exclude': exclude,
        'ct_field': ct_field,
        'fk_field': fk_field,
    }
    if child_form_kwargs:
        child_kwargs.update(child_form_kwargs)

    FormSet = generic_inlineformset_factory(**kwargs)
    FormSet.child_forms = polymorphic_child_forms_factory(
        formset_children, **child_kwargs)
    return FormSet