Projet

Général

Profil

0001-forms-if-not-form-class-is-given-to-modelform_factor.patch

Serghei Mihai, 29 mai 2015 11:53

Télécharger (5,32 ko)

Voir les différences:

Subject: [PATCH 1/2] forms: if not form class is given to modelform_factory()
 on User model, user BaseUserForm (fixes #7391)

Building of the base classe tuple has been refactoed.

Bug introduced in 7141a96e6
 src/authentic2/forms.py | 24 +++++++++++------------
 src/authentic2/tests.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 62 insertions(+), 13 deletions(-)
src/authentic2/forms.py
76 76
            self.save_m2m = save_m2m
77 77
        return result
78 78

  
79

  
79 80
def modelform_factory(model, **kwargs):
80 81
    '''Build a modelform for the given model,
81 82

  
82 83
       For the user model also add attribute based fields.
83 84
    '''
84
    form = kwargs.pop('form', None) or forms.ModelForm
85
    form = kwargs.pop('form', None)
85 86
    fields = kwargs.get('fields', [])
86 87
    required = list(kwargs.pop('required', []))
87 88
    d = {}
88
    if not form or not hasattr(form, 'Meta'):
89
        meta_d = {'model': model, 'fields': '__all__'}
90
        meta = type('Meta', (), meta_d)
91
        d['Meta'] = meta
92
    bases = (form,)
93 89
    # KV attributes are only supported for the user model currently
94 90
    modelform = None
95 91
    if model == get_user_model():
96
        if form:
97
            bases = (form,)
98
        else:
99
            bases = (BaseUserForm,)
92
        if not form:
93
            form = BaseUserForm
100 94
        attributes = models.Attribute.objects.all()
101 95
        for attribute in attributes:
102 96
            if fields and attribute.name not in fields:
......
105 99
        for field in app_settings.A2_REQUIRED_FIELDS:
106 100
            if not field in required:
107 101
                required.append(field)
102
    if not form or not hasattr(form, 'Meta'):
103
        meta_d = {'model': model, 'fields': '__all__'}
104
        meta = type('Meta', (), meta_d)
105
        d['Meta'] = meta
106
    if not form:  # fallback
107
        form = forms.ModelForm
108 108
    modelform = None
109 109
    if required:
110 110
        def __init__(self, *args, **kwargs):
111 111
            super(modelform, self).__init__(*args, **kwargs)
112 112
            for field in required:
113 113
                if field in self.fields:
114
		    self.fields[field].required = True
114
                    self.fields[field].required = True
115 115
        d['__init__'] = __init__
116
    modelform = type(model.__name__ + 'ModelForm', bases, d)
116
    modelform = type(model.__name__ + 'ModelForm', (form,), d)
117 117
    kwargs['form'] = modelform
118 118
    return django_modelform_factory(model, **kwargs)
src/authentic2/tests.py
284 284
                                            'password2': 'toto'})
285 285
        self.assertEqual(response.status_code, 200)
286 286
        self.assertFormError(response, 'form', 'password1', ['password must contain at least 6 characters'])
287
        
287

  
288 288
        response = self.client.post(link, { 'password1': 'T0toto',
289 289
                                            'password2': 'T0toto'})
290 290
        new_user = User.objects.get()
......
453 453
        self.assertNotContains(response, 'John')
454 454

  
455 455

  
456
class UserProfileTests(TestCase):
457
    def setUp(self):
458
        from django.contrib.auth import get_user_model
459
        User = get_user_model()
460
        user = User.objects.create(username='testbot')
461
        user.set_password('secret')
462
        user.save()
463
        self.client = Client()
464

  
465
    def test_edit_profile_attributes(self):
466

  
467
        models.Attribute.objects.create(
468
            label=u'custom',
469
            name='custom',
470
            required=True,
471
            user_visible=True,
472
            user_editable=True,
473
            kind='string')
474
        models.Attribute.objects.create(
475
            label=u'ID',
476
            name='national_number',
477
            user_editable=True,
478
            user_visible=True,
479
            kind='string')
480
        self.assertTrue(self.client.login(username='testbot', password='secret'))
481

  
482
        # get the edit page in order to check form's prefix
483
        response = self.client.get(reverse('profile_edit'))
484
        form = get_response_form(response)
485

  
486
        kwargs = {'custom': 'random data',
487
                  'national_number': 'xx20153566342yy'}
488
        if form.prefix:
489
            kwargs = dict(('%s-%s' % (form.prefix, k), v)
490
                          for k, v in kwargs.iteritems())
491

  
492
        response = self.client.post(reverse('profile_edit'), kwargs)
493

  
494
        self.assertEqual(response.status_code, 302)
495
        response = self.client.get(reverse('account_management'))
496
        self.assertContains(response, 'random data')
497
        self.assertContains(response, 'xx20153566342yy')
498

  
499
        response = self.client.get(reverse('profile_edit'))
500
        form = get_response_form(response)
501
        self.assertEqual(form['custom'].value(), 'random data')
502
        self.assertEqual(form['national_number'].value(), 'xx20153566342yy')
503

  
504

  
456 505
class CacheTests(TestCase):
457 506
    urls = 'authentic2.cache_tests_urls'
458 507

  
459
-