0001-forms-if-not-form-class-is-given-to-modelform_factor.patch
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 |
- |