Skip to content

Commit

Permalink
Merge branch 'fix/lazy-load-table-creation'
Browse files Browse the repository at this point in the history
  • Loading branch information
seawolf42 committed Jun 7, 2018
2 parents 7af81f9 + b24689e commit a0c1c9a
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 19 deletions.
14 changes: 10 additions & 4 deletions lookup_tables/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@ class LookupTableItemField(db_models.ForeignKey):

def __init__(self, table_ref, *args, **kwargs):
self.table_ref = table_ref
self.lookuptable = models.LookupTable.objects.filter(table_ref=table_ref).first()
if not self.lookuptable:
self.lookuptable = models.LookupTable.objects.create(table_ref=table_ref, name=table_ref)
models.LookupTableItem.objects.create(table=self.lookuptable, name='<DEFAULT>')
self.lookuptable = None
kwargs['to'] = 'lookup_tables.LookupTableItem'
kwargs['on_delete'] = db_models.PROTECT
kwargs['limit_choices_to'] = self.get_lookuptableitem_choices
Expand All @@ -24,4 +21,13 @@ def deconstruct(self):
return name, path, args, kwargs

def get_lookuptableitem_choices(self):
if not self.lookuptable:
self._init_lookuptable()
return db_models.Q(table=self.lookuptable)

def _init_lookuptable(self):
lookuptable = models.LookupTable.objects.filter(table_ref=self.table_ref).first()
if not lookuptable:
lookuptable = models.LookupTable.objects.create(table_ref=self.table_ref, name=self.table_ref)
models.LookupTableItem.objects.create(table=lookuptable, name='<DEFAULT>')
self.lookuptable = lookuptable
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

setup(
name='django-lookup-tables',
version='0.10.4',
version='0.11.0',
packages=find_packages(),
include_package_data=True,
license='MIT License',
Expand Down
21 changes: 7 additions & 14 deletions tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ class LookupTableItemField(TestCase):
def test_construction(self, mock_fk_init):
self.assertEqual(models.LookupTable.objects.filter(name=strings[0]).count(), 0)
item = fields.LookupTableItemField(table_ref=strings[0])
self.assertEqual(models.LookupTable.objects.filter(name=strings[0]).count(), 1)
self.assertEqual(models.LookupTable.objects.filter(name=strings[0]).count(), 0)
self.assertEqual(item.table_ref, strings[0])
self.assertEqual(item.lookuptable, models.LookupTable.objects.get())
self.assertEqual(item.lookuptable, None)

@mock.patch('django.db.models.ForeignKey.__init__')
def test_kwargs_includes_foreign_key_requisite_values(self, mock_fk_init):
Expand All @@ -53,8 +53,8 @@ def test_deconstruct_removes_programmatic_args(self):

def test_get_choices(self):
item = fields.LookupTableItemField(table_ref=strings[0])
table = models.LookupTable.objects.get(name=strings[0])
choices = [table.lookuptableitem_set.first()] + [
table = models.LookupTable.objects.create(name=strings[0])
choices = [
models.LookupTableItem.objects.create(table=table, name=strings[i], sort_order=i)
for i in range(len(strings))
]
Expand All @@ -66,20 +66,13 @@ def test_get_choices(self):
for i, choice in enumerate(models.LookupTableItem.objects.filter(q_filter)):
self.assertEqual(choice, choices[i])


class TestLookupTableItemFieldCreation(TestCase):

def test_table_created_from_field_reference(self):
item = fields.LookupTableItemField(table_ref=strings[0])
self.assertEqual(models.LookupTable.objects.count(), 0)
self.assertEqual(models.LookupTableItem.objects.count(), 0)

class DummyFieldTestModel(db_models.Model):
lookup = fields.LookupTableItemField(table_ref=strings[0])

class Meta:
app_label = 'test'

item.get_lookuptableitem_choices()
self.assertEqual(models.LookupTable.objects.count(), 1)
table = models.LookupTable.objects.get(table_ref=strings[0])
self.assertEqual(item.lookuptable, table)
self.assertEqual(models.LookupTableItem.objects.count(), 1)
models.LookupTableItem.objects.get(table=table, name='<DEFAULT>')

0 comments on commit a0c1c9a

Please sign in to comment.