Skip to content

Commit 9236eaa

Browse files
committed
Removed display fallback to str method due to recursion error.
1 parent f8820ba commit 9236eaa

File tree

3 files changed

+25
-85
lines changed

3 files changed

+25
-85
lines changed

tests/models.py

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class Meta(TreeNodeModel.Meta):
2121
verbose_name_plural = 'Categories'
2222

2323

24-
class CategoryUUID(TreeNodeModel):
24+
class CategoryWithUUIDPk(TreeNodeModel):
2525

2626
treenode_display_field = 'name'
2727

@@ -34,7 +34,7 @@ class Meta(TreeNodeModel.Meta):
3434
verbose_name_plural = 'Categories'
3535

3636

37-
class CategoryStr(TreeNodeModel):
37+
class CategoryWithoutDisplayField(TreeNodeModel):
3838

3939
name = models.CharField(max_length=50, unique=True)
4040

@@ -43,28 +43,3 @@ class Meta(TreeNodeModel.Meta):
4343
verbose_name = 'Category'
4444
verbose_name_plural = 'Categories'
4545

46-
def __str__(self):
47-
return self.name
48-
49-
50-
class CategoryUUIDStr(TreeNodeModel):
51-
52-
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
53-
name = models.CharField(max_length=50, unique=True)
54-
55-
class Meta(TreeNodeModel.Meta):
56-
app_label = 'tests'
57-
verbose_name = 'Category'
58-
verbose_name_plural = 'Categories'
59-
60-
def __str__(self):
61-
return f'{self.name}'
62-
63-
class CategoryPk(TreeNodeModel):
64-
65-
name = models.CharField(max_length=50, unique=True)
66-
67-
class Meta(TreeNodeModel.Meta):
68-
app_label = 'tests'
69-
verbose_name = 'Category'
70-
verbose_name_plural = 'Categories'

tests/test_models.py

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@
33
from django.conf import settings
44
from django.test import TransactionTestCase
55
from django.utils.encoding import force_text
6+
67
from treenode.cache import clear_cache
78
from treenode.utils import join_pks
89

9-
from .models import (Category, CategoryPk, CategoryStr, CategoryUUID,
10-
CategoryUUIDStr)
10+
from .models import (
11+
Category,
12+
CategoryWithUUIDPk,
13+
CategoryWithoutDisplayField,
14+
)
1115

1216

13-
class TreeNodeModelsTestCaseBase:
14-
_category_model: object = None
17+
class TreeNodeModelTestCaseBase:
18+
_category_model = None
1519

1620
def setUp(self):
1721
pass
@@ -1218,53 +1222,14 @@ def test_deep_cat_tree_ordering(self):
12181222
self.assertEqual(len(cat_level_1_descendants), len(cat_level_1_expected_descendants))
12191223
self.assertEqual(cat_level_1_descendants, cat_level_1_expected_descendants)
12201224

1221-
class TreeNodeModelsTestCasePk(TreeNodeModelsTestCaseBase):
1222-
def __create_cat(cls, name, parent=None, priority=0):
1223-
return cls._category_model.objects.create(
1224-
name=name,
1225-
tn_parent=parent,
1226-
tn_priority=priority)
12271225

1228-
def test_get_display(self):
1229-
a = self.__create_cat(name='à')
1230-
c = self.__create_cat(name='ç', parent=a)
1231-
e = self.__create_cat(name='è', parent=c)
1232-
i = self.__create_cat(name='ì', parent=e)
1233-
o = self.__create_cat(name='ò', parent=i)
1234-
u = self.__create_cat(name='ù', parent=o)
1235-
opts = {'indent': False, 'mark': '- '}
1236-
self.assertEqual(a.get_display(**opts), force_text(f'{a.pk}'))
1237-
self.assertEqual(c.get_display(**opts), force_text(f'{c.pk}'))
1238-
self.assertEqual(e.get_display(**opts), force_text(f'{e.pk}'))
1239-
self.assertEqual(i.get_display(**opts), force_text(f'{i.pk}'))
1240-
self.assertEqual(o.get_display(**opts), force_text(f'{o.pk}'))
1241-
self.assertEqual(u.get_display(**opts), force_text(f'{u.pk}'))
1242-
opts = {'indent': True, 'mark': '- '}
1243-
self.assertEqual(a.get_display(**opts), force_text(f'{a.pk}'))
1244-
self.assertEqual(c.get_display(**opts), force_text(f'- {c.pk}'))
1245-
self.assertEqual(e.get_display(**opts), force_text(f'- - {e.pk}'))
1246-
self.assertEqual(i.get_display(**opts), force_text(f'- - - {i.pk}'))
1247-
self.assertEqual(o.get_display(**opts), force_text(f'- - - - {o.pk}'))
1248-
self.assertEqual(u.get_display(**opts), force_text(f'- - - - - {u.pk}'))
1249-
1250-
1251-
1252-
1253-
class TreeNodeModelsIdTestCase(TreeNodeModelsTestCaseBase, TransactionTestCase):
1226+
class ModelTestCase(TreeNodeModelTestCaseBase, TransactionTestCase):
12541227
_category_model = Category
12551228

12561229

1257-
class TreeNodeModelsUUIDTestCase(TreeNodeModelsTestCaseBase, TransactionTestCase):
1258-
_category_model = CategoryUUID
1259-
1260-
1261-
class TreeNodeModelsIdStrTestCase(TreeNodeModelsTestCaseBase, TransactionTestCase):
1262-
_category_model = CategoryStr
1263-
1264-
1265-
class TreeNodeModelsUUIDStrTestCase(TreeNodeModelsTestCaseBase, TransactionTestCase):
1266-
_category_model = CategoryUUIDStr
1230+
class ModelWithUUIDPkTestCase(TreeNodeModelTestCaseBase):
1231+
_category_model = CategoryWithUUIDPk
12671232

12681233

1269-
class TreeNodeModelsPkTestCase(TreeNodeModelsTestCasePk, TransactionTestCase):
1270-
_category_model = CategoryPk
1234+
class ModelWithoutDisplayFieldTestCase(TreeNodeModelTestCaseBase):
1235+
_category_model = CategoryWithoutDisplayField

treenode/models.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
from __future__ import unicode_literals
44

5-
import uuid
6-
75
from django.core.validators import MaxValueValidator, MinValueValidator
86
from django.db import models, transaction
97
from django.utils.encoding import force_text
108
from django.utils.text import slugify
119
from django.utils.translation import gettext_lazy as _
10+
1211
from six import python_2_unicode_compatible
1312

1413
from . import classproperty
@@ -18,6 +17,8 @@
1817
from .signals import connect_signals, no_signals
1918
from .utils import join_pks, split_pks
2019

20+
import uuid
21+
2122

2223
@python_2_unicode_compatible
2324
class TreeNodeModel(models.Model):
@@ -199,24 +200,23 @@ def get_display(self, indent=True, mark='— '):
199200
indentation = (mark * self.tn_ancestors_count) if indent else ''
200201
indentation = force_text(indentation)
201202
text = self.get_display_text()
203+
text = force_text(text)
202204
return indentation + text
203205

204206
def get_display_text(self):
205207
"""
206208
Gets the text that will be indented in `get_display` method.
207209
Returns the `treenode_display_field` value if specified,
208-
otherwise falls back on the model's __str__().
210+
otherwise falls back on the model's pk.
209211
Override this method to return another field or a computed value. #27
210212
"""
213+
text = ''
211214
if hasattr(self, 'treenode_display_field') and self.treenode_display_field is not None:
212215
field_name = getattr(self, 'treenode_display_field')
213-
text = getattr(self, field_name)
214-
elif type(self).__str__ not in [object.__str__, TreeNodeModel.__str__]:
215-
text = f'{self}'
216-
else:
216+
text = getattr(self, field_name, '')
217+
if not text and self.pk:
217218
text = self.pk
218-
text = force_text(text)
219-
return text
219+
return force_text(text)
220220

221221
def get_first_child(self, cache=True):
222222
return self.get_children(cache=cache)[0] \
@@ -625,7 +625,7 @@ def __get_node_tree(obj):
625625

626626
return objs_tree
627627

628-
#  Public properties
628+
# Public properties
629629
# All properties map a get_{{property}}() method.
630630

631631
@property

0 commit comments

Comments
 (0)