mirror of
https://github.com/jazzband/django-eav2.git
synced 2026-03-16 22:40:26 +00:00
Add tests for forms
This commit is contained in:
parent
0677e7f7b5
commit
23be8b41a9
8 changed files with 89 additions and 22 deletions
|
|
@ -2,3 +2,4 @@
|
|||
omit =
|
||||
*/migrations/*
|
||||
eav/__init__.py
|
||||
eav/utils.py
|
||||
|
|
|
|||
19
eav/admin.py
19
eav/admin.py
|
|
@ -10,11 +10,10 @@ from .models import Attribute, EnumGroup, EnumValue, Value
|
|||
|
||||
|
||||
class BaseEntityAdmin(ModelAdmin):
|
||||
|
||||
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
|
||||
def render_change_form(self, request, context, *args, **kwargs):
|
||||
"""
|
||||
Wrapper for ModelAdmin.render_change_form. Replaces standard static
|
||||
AdminForm with an EAV-friendly one. The point is that our form generates
|
||||
Wrapper for `ModelAdmin.render_change_form`. Replaces standard static
|
||||
`AdminForm` with an EAV-friendly one. The point is that our form generates
|
||||
fields dynamically and fieldsets must be inferred from a prepared and
|
||||
validated form instance, not just the form class. Django does not seem
|
||||
to provide hooks for this purpose, so we simply wrap the view and
|
||||
|
|
@ -22,16 +21,16 @@ class BaseEntityAdmin(ModelAdmin):
|
|||
"""
|
||||
form = context['adminform'].form
|
||||
|
||||
# infer correct data from the form
|
||||
# Infer correct data from the form.
|
||||
fieldsets = self.fieldsets or [(None, {'fields': form.fields.keys()})]
|
||||
adminform = admin.helpers.AdminForm(form, fieldsets,
|
||||
self.prepopulated_fields)
|
||||
adminform = admin.helpers.AdminForm(form, fieldsets, self.prepopulated_fields)
|
||||
media = mark_safe(self.media + adminform.media)
|
||||
|
||||
context.update(adminform=adminform, media=media)
|
||||
|
||||
super_meth = super(BaseEntityAdmin, self).render_change_form
|
||||
return super_meth(request, context, add, change, form_url, obj)
|
||||
return super(BaseEntityAdmin, self).render_change_form(
|
||||
request, context, *args, **kwargs
|
||||
)
|
||||
|
||||
|
||||
class BaseEntityInlineFormSet(BaseInlineFormSet):
|
||||
|
|
@ -75,10 +74,12 @@ class BaseEntityInline(InlineModelAdmin):
|
|||
|
||||
return [(None, {'fields': form.fields.keys()})]
|
||||
|
||||
|
||||
class AttributeAdmin(ModelAdmin):
|
||||
list_display = ('name', 'slug', 'datatype', 'description')
|
||||
prepopulated_fields = {'slug': ('name',)}
|
||||
|
||||
|
||||
admin.site.register(Attribute, AttributeAdmin)
|
||||
admin.site.register(Value)
|
||||
admin.site.register(EnumValue)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ class BaseDynamicEntityForm(ModelForm):
|
|||
validation is actually done, all EAV fields are present in it (unless
|
||||
Rubric is not defined).
|
||||
'''
|
||||
|
||||
FIELD_CLASSES = {
|
||||
'text': CharField,
|
||||
'float': FloatField,
|
||||
|
|
@ -78,16 +77,15 @@ class BaseDynamicEntityForm(ModelForm):
|
|||
|
||||
Returns ``instance``.
|
||||
"""
|
||||
|
||||
if self.errors:
|
||||
raise ValueError(_(u"The %s could not be saved because the data"
|
||||
u"didn't validate.") % \
|
||||
self.instance._meta.object_name)
|
||||
|
||||
# create entity instance, don't save yet
|
||||
# Create entity instance, don't save yet.
|
||||
instance = super(BaseDynamicEntityForm, self).save(commit=False)
|
||||
|
||||
# assign attributes
|
||||
# Assign attributes.
|
||||
for attribute in self.entity.get_all_attributes():
|
||||
value = self.cleaned_data.get(attribute.slug)
|
||||
if attribute.datatype == attribute.TYPE_ENUM:
|
||||
|
|
@ -98,7 +96,7 @@ class BaseDynamicEntityForm(ModelForm):
|
|||
|
||||
setattr(self.entity, attribute.slug, value)
|
||||
|
||||
# save entity and its attributes
|
||||
# Save entity and its attributes.
|
||||
if commit:
|
||||
instance.save()
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import sys
|
|||
from django.db.models import Q
|
||||
|
||||
|
||||
def print_q_expr(expr, indent="", is_tail=True): # pragma: no cover
|
||||
def print_q_expr(expr, indent="", is_tail=True):
|
||||
'''
|
||||
Simple print method for debugging Q-expressions' trees.
|
||||
'''
|
||||
|
|
|
|||
3
runtests
3
runtests
|
|
@ -19,7 +19,8 @@ if __name__ == "__main__":
|
|||
'tests.data_validation',
|
||||
'tests.attributes',
|
||||
'tests.misc_models',
|
||||
'tests.set_and_get'
|
||||
'tests.set_and_get',
|
||||
'tests.forms'
|
||||
]
|
||||
else:
|
||||
tests = ['tests.{}'.format(arg) for arg in sys.argv[1:]]
|
||||
|
|
|
|||
|
|
@ -2,18 +2,14 @@ from django.core.exceptions import ValidationError
|
|||
from django.test import TestCase
|
||||
|
||||
import eav
|
||||
from eav.exceptions import IllegalAssignmentException
|
||||
from eav.models import Attribute, Value
|
||||
from eav.registry import EavConfig
|
||||
from eav.exceptions import IllegalAssignmentException
|
||||
|
||||
from .models import Encounter, Patient
|
||||
|
||||
|
||||
class Attributes(TestCase):
|
||||
'''
|
||||
TODO: Explain this test.
|
||||
'''
|
||||
|
||||
def setUp(self):
|
||||
class EncounterEavConfig(EavConfig):
|
||||
manager_attr = 'eav_objects'
|
||||
|
|
|
|||
71
tests/forms.py
Normal file
71
tests/forms.py
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
from django.test import TestCase
|
||||
from django.contrib.admin.sites import AdminSite
|
||||
|
||||
import eav
|
||||
from eav.admin import *
|
||||
from .models import Patient
|
||||
from eav.models import Attribute
|
||||
from eav.forms import BaseDynamicEntityForm
|
||||
from django.contrib import admin
|
||||
from django.core.handlers.base import BaseHandler
|
||||
from django.test.client import RequestFactory
|
||||
from django.forms import ModelForm
|
||||
|
||||
|
||||
class MockRequest(RequestFactory):
|
||||
def request(self, **request):
|
||||
"Construct a generic request object."
|
||||
request = RequestFactory.request(self, **request)
|
||||
handler = BaseHandler()
|
||||
handler.load_middleware()
|
||||
for middleware_method in handler._request_middleware:
|
||||
if middleware_method(request):
|
||||
raise Exception("Couldn't create request mock object - "
|
||||
"request middleware returned a response")
|
||||
return request
|
||||
|
||||
|
||||
class MockSuperUser:
|
||||
def __init__(self):
|
||||
self.is_active = True
|
||||
self.is_staff = True
|
||||
|
||||
def has_perm(self, perm):
|
||||
return True
|
||||
|
||||
|
||||
request = MockRequest().request()
|
||||
request.user = MockSuperUser()
|
||||
|
||||
|
||||
class Forms(TestCase):
|
||||
def setUp(self):
|
||||
eav.register(Patient)
|
||||
Attribute.objects.create(name='weight', datatype=Attribute.TYPE_FLOAT)
|
||||
Attribute.objects.create(name='color', datatype=Attribute.TYPE_TEXT)
|
||||
self.instance = Patient.objects.create(name='Jim Morrison')
|
||||
self.site = AdminSite()
|
||||
|
||||
def test_fields(self):
|
||||
admin = BaseEntityAdmin(Patient, self.site)
|
||||
admin.form = BaseDynamicEntityForm
|
||||
view = admin.change_view(request, str(self.instance.pk))
|
||||
|
||||
own_fields = 1
|
||||
adminform = view.context_data['adminform']
|
||||
|
||||
self.assertEqual(
|
||||
len(adminform.form.fields), Attribute.objects.count() + own_fields
|
||||
)
|
||||
|
||||
def test_submit(self):
|
||||
class PatientForm(ModelForm):
|
||||
class Meta:
|
||||
model = Patient
|
||||
fields = '__all__'
|
||||
|
||||
self.instance.eav.color = 'Blue'
|
||||
form = PatientForm(self.instance.__dict__, instance=self.instance)
|
||||
jim = form.save()
|
||||
|
||||
self.assertEqual(jim.eav.color, 'Blue')
|
||||
|
|
@ -7,7 +7,6 @@ from .models import Patient
|
|||
|
||||
|
||||
class MiscModels(TestCase):
|
||||
|
||||
def test_enumgroup_str(self):
|
||||
name = 'Yes / No'
|
||||
e = EnumGroup.objects.create(name=name)
|
||||
|
|
|
|||
Loading…
Reference in a new issue