1
|
|
|
from django.core.cache import cache |
2
|
|
|
from django.db.models import Manager |
3
|
|
|
from .utils import AppTestCase |
4
|
|
|
from .testapp.models import ManualModel, ManualModelTranslations, SimpleModel, Level1, Level2, ProxyBase, ProxyModel, DoubleModel, RegularModel, CharModel |
5
|
|
|
|
6
|
|
|
|
7
|
|
|
class ModelConstructionTests(AppTestCase): |
8
|
|
|
""" |
9
|
|
|
Test model construction |
10
|
|
|
""" |
11
|
|
|
|
12
|
|
|
def test_manual_model(self): |
13
|
|
|
""" |
14
|
|
|
Test the metaclass of the model. |
15
|
|
|
""" |
16
|
|
|
# Test whether the link has taken place |
17
|
|
|
self.assertIsInstance(ManualModel().translations, Manager) # RelatedManager class |
18
|
|
|
self.assertIs(ManualModel().translations.model, ManualModelTranslations) |
19
|
|
|
self.assertIs(ManualModel._parler_meta.root_model, ManualModelTranslations) |
20
|
|
|
|
21
|
|
|
def test_simple_model(self): |
22
|
|
|
""" |
23
|
|
|
Test the simple model syntax. |
24
|
|
|
""" |
25
|
|
|
self.assertIs(SimpleModel().translations.model, SimpleModel._parler_meta.root_model) |
26
|
|
|
|
27
|
|
View Code Duplication |
def test_inherited_model(self): |
|
|
|
|
28
|
|
|
""" |
29
|
|
|
Test the inherited model syntax. |
30
|
|
|
""" |
31
|
|
|
# First level has 1 ParlerMeta object |
32
|
|
|
self.assertEqual(Level1._parler_meta.root.rel_name, 'l1_translations') |
33
|
|
|
self.assertEqual(Level1._parler_meta.root.model.__name__, 'Level1Translation') |
34
|
|
|
self.assertEqual(len(Level1._parler_meta), 1) |
35
|
|
|
|
36
|
|
|
# Second level has 2 ParlerMeta objects. |
37
|
|
|
self.assertEqual(len(Level2._parler_meta), 2) |
38
|
|
|
self.assertEqual(Level2._parler_meta[0].rel_name, 'l1_translations') |
39
|
|
|
self.assertEqual(Level2._parler_meta[1].rel_name, 'l2_translations') |
40
|
|
|
self.assertEqual(Level2._parler_meta[1].model.__name__, 'Level2Translation') |
41
|
|
|
|
42
|
|
|
# Level 2 root attributes should point to the top-level object (Level1) |
43
|
|
|
self.assertEqual(Level2._parler_meta.root_model.__name__, 'Level1Translation') |
44
|
|
|
self.assertEqual(Level2._parler_meta.root_rel_name, 'l1_translations') |
45
|
|
|
self.assertEqual(Level2._parler_meta.root, Level1._parler_meta.root) |
46
|
|
|
|
47
|
|
View Code Duplication |
def test_proxy_model(self): |
|
|
|
|
48
|
|
|
""" |
49
|
|
|
Test whether proxy models can get new translations |
50
|
|
|
""" |
51
|
|
|
# First level has 1 ParlerMeta object |
52
|
|
|
self.assertEqual(ProxyBase._parler_meta.root.rel_name, 'base_translations') |
53
|
|
|
self.assertEqual(len(ProxyBase._parler_meta), 1) |
54
|
|
|
|
55
|
|
|
# Second level has 2 ParlerMeta objects |
56
|
|
|
self.assertEqual(len(ProxyModel._parler_meta), 2) |
57
|
|
|
self.assertEqual(ProxyModel._parler_meta[0].rel_name, 'base_translations') |
58
|
|
|
self.assertEqual(ProxyModel._parler_meta[1].rel_name, 'proxy_translations') |
59
|
|
|
|
60
|
|
|
self.assertEqual(ProxyModel._parler_meta[0].model.__name__, 'ProxyBaseTranslation') |
61
|
|
|
self.assertEqual(ProxyModel._parler_meta[1].model.__name__, 'ProxyModelTranslation') |
62
|
|
|
|
63
|
|
|
# Second inheritance level attributes should point to the top-level object (ProxyBase) |
64
|
|
|
self.assertEqual(ProxyModel._parler_meta.root_model.__name__, 'ProxyBaseTranslation') |
65
|
|
|
self.assertEqual(ProxyModel._parler_meta.root_rel_name, 'base_translations') |
66
|
|
|
self.assertEqual(ProxyModel._parler_meta.root, ProxyBase._parler_meta.root) |
67
|
|
|
|
68
|
|
|
def test_double_translation_table(self): |
69
|
|
|
""" |
70
|
|
|
Test how assigning two translation tables works. |
71
|
|
|
""" |
72
|
|
|
self.assertIsNone(DoubleModel._parler_meta.base) # Should call .add_meta() instead of overwriting/chaining it. |
73
|
|
|
self.assertEqual(len(DoubleModel._parler_meta), 2) |
74
|
|
|
self.assertEqual(DoubleModel._parler_meta[0].rel_name, "base_translations") |
75
|
|
|
self.assertEqual(DoubleModel._parler_meta[1].rel_name, "more_translations") |
76
|
|
|
|
77
|
|
|
def test_overlapping_proxy_model(self): |
78
|
|
|
""" |
79
|
|
|
Test the simple model syntax. |
80
|
|
|
""" |
81
|
|
|
from parler.tests.testapp.invalid_models import RegularModelProxy |
82
|
|
|
|
83
|
|
|
# Create an object without translations |
84
|
|
|
RegularModel.objects.create(id=98, original_field='untranslated') |
85
|
|
|
self.assertEqual(RegularModelProxy.objects.count(), 1) |
86
|
|
|
|
87
|
|
|
# Refetch from db, should raise an error. |
88
|
|
|
self.assertRaises(RuntimeError, lambda: RegularModelProxy.objects.all()[0]) |
89
|
|
|
|
90
|
|
|
def test_model_with_different_pks(self): |
91
|
|
|
""" |
92
|
|
|
Test that TranslatableModels works with different types of pks |
93
|
|
|
""" |
94
|
|
|
self.assertIsInstance(SimpleModel.objects.create(tr_title='Test'), SimpleModel) |
95
|
|
|
self.assertIsInstance(CharModel.objects.create(pk='test', tr_title='Test'), CharModel) |
96
|
|
|
|