<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -357,6 +357,7 @@ answer newbie questions, and generally made Django that much better:
     ricardojbarrios@gmail.com
     Mike Richardson
     Matt Riggott
+    Alex Robbins &lt;alexander.j.robbins@gmail.com&gt;
     Henrique Romano &lt;onaiort@gmail.com&gt;
     Armin Ronacher
     Daniel Roseman &lt;http://roseman.org.uk/&gt;</diff>
      <filename>AUTHORS</filename>
    </modified>
    <modified>
      <diff>@@ -389,6 +389,8 @@ class GenericInlineModelAdmin(InlineModelAdmin):
             &quot;can_delete&quot;: True,
             &quot;can_order&quot;: False,
             &quot;fields&quot;: fields,
+            &quot;max_num&quot;: self.max_num,
+            &quot;exclude&quot;: self.exclude
         }
         return generic_inlineformset_factory(self.model, **defaults)
 </diff>
      <filename>django/contrib/contenttypes/generic.py</filename>
    </modified>
    <modified>
      <diff>@@ -20,11 +20,55 @@ class Media(models.Model):
 
 class MediaInline(generic.GenericTabularInline):
     model = Media
-    extra = 1
     
 class EpisodeAdmin(admin.ModelAdmin):
     inlines = [
         MediaInline,
     ]
-
 admin.site.register(Episode, EpisodeAdmin)
+
+#
+# These models let us test the different GenericInline settings at
+# different urls in the admin site.
+#
+
+#
+# Generic inline with extra = 0
+#
+
+class EpisodeExtra(Episode):
+    pass
+
+class MediaExtraInline(generic.GenericTabularInline):
+    model = Media
+    extra = 0
+
+admin.site.register(EpisodeExtra, inlines=[MediaExtraInline])
+
+#
+# Generic inline with extra and max_num
+#
+
+class EpisodeMaxNum(Episode):
+    pass
+
+class MediaMaxNumInline(generic.GenericTabularInline):
+    model = Media
+    extra = 5
+    max_num = 2
+    
+admin.site.register(EpisodeMaxNum, inlines=[MediaMaxNumInline])
+
+#
+# Generic inline with exclude
+#
+
+class EpisodeExclude(Episode):
+    pass
+
+class MediaExcludeInline(generic.GenericTabularInline):
+    model = Media
+    exclude = ['url']
+
+admin.site.register(EpisodeExclude, inlines=[MediaExcludeInline])
+</diff>
      <filename>tests/regressiontests/generic_inline_admin/models.py</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ from django.conf import settings
 from django.contrib.contenttypes.generic import generic_inlineformset_factory
 
 # local test models
-from models import Episode, Media
+from models import Episode, EpisodeExtra, EpisodeMaxNum, EpisodeExclude, Media
 
 class GenericAdminViewTest(TestCase):
     fixtures = ['users.xml']
@@ -80,3 +80,62 @@ class GenericAdminViewTest(TestCase):
         # Regression test for #10522.
         inline_formset = generic_inlineformset_factory(Media,
             exclude=('url',))
+
+class GenericInlineAdminParametersTest(TestCase):
+    fixtures = ['users.xml']
+
+    def setUp(self):
+        self.client.login(username='super', password='secret')
+        
+        # Can't load content via a fixture (since the GenericForeignKey
+        # relies on content type IDs, which will vary depending on what
+        # other tests have been run), thus we do it here.
+        test_classes = [
+            Episode,
+            EpisodeExtra,
+            EpisodeMaxNum,
+            EpisodeExclude,
+        ]
+        for klass in test_classes:
+            e = klass.objects.create(name='This Week in Django')
+            m = Media(content_object=e, url='http://example.com/podcast.mp3')
+            m.save()
+    
+    def tearDown(self):
+        self.client.logout()
+
+    def testNoParam(self):
+        &quot;&quot;&quot;
+        With one initial form, extra (default) at 3, there should be 4 forms.
+        &quot;&quot;&quot;
+        response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episode/1/')
+        formset = response.context['inline_admin_formsets'][0].formset
+        self.assertEqual(formset.total_form_count(), 4)
+        self.assertEqual(formset.initial_form_count(), 1)
+
+    def testExtraParam(self):
+        &quot;&quot;&quot;
+        With extra=0, there should be one form.
+        &quot;&quot;&quot;
+        response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episodeextra/2/')
+        formset = response.context['inline_admin_formsets'][0].formset
+        self.assertEqual(formset.total_form_count(), 1)
+        self.assertEqual(formset.initial_form_count(), 1)
+
+    def testMaxNumParam(self):
+        &quot;&quot;&quot;
+        With extra=5 and max_num=2, there should be only 2 forms.
+        &quot;&quot;&quot;
+        inline_form_data = '&lt;input type=&quot;hidden&quot; name=&quot;generic_inline_admin-media-content_type-object_id-TOTAL_FORMS&quot; value=&quot;2&quot; id=&quot;id_generic_inline_admin-media-content_type-object_id-TOTAL_FORMS&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;generic_inline_admin-media-content_type-object_id-INITIAL_FORMS&quot; value=&quot;1&quot; id=&quot;id_generic_inline_admin-media-content_type-object_id-INITIAL_FORMS&quot; /&gt;'
+        response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episodemaxnum/3/')
+        formset = response.context['inline_admin_formsets'][0].formset
+        self.assertEqual(formset.total_form_count(), 2)
+        self.assertEqual(formset.initial_form_count(), 1)
+
+    def testExcludeParam(self):
+        &quot;&quot;&quot;
+        Generic inline formsets should respect include.
+        &quot;&quot;&quot;
+        response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episodeexclude/4/')
+        formset = response.context['inline_admin_formsets'][0].formset
+        self.failIf('url' in formset.forms[0], 'The formset has excluded &quot;url&quot; field.')
\ No newline at end of file</diff>
      <filename>tests/regressiontests/generic_inline_admin/tests.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>d76f16e878cf4c4d2528c9af3a604577088674e7</id>
    </parent>
  </parents>
  <author>
    <name>jacob</name>
    <email>jacob@bcc190cf-cafb-0310-a4f2-bffc1f526a37</email>
  </author>
  <url>http://github.com/kkubasik/django/commit/e1bbccb636007d4afcd9937ac7e118e73fb6a285</url>
  <id>e1bbccb636007d4afcd9937ac7e118e73fb6a285</id>
  <committed-date>2009-04-18T13:12:53-07:00</committed-date>
  <authored-date>2009-04-18T13:12:53-07:00</authored-date>
  <message>Fixed #9122: generic inline formsets now respect exclude and max_num. Thanks, Alex Robbins.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10586 bcc190cf-cafb-0310-a4f2-bffc1f526a37</message>
  <tree>fc74fa0cea8e808dc82dbb145f4008d190228657</tree>
  <committer>
    <name>jacob</name>
    <email>jacob@bcc190cf-cafb-0310-a4f2-bffc1f526a37</email>
  </committer>
</commit>
