|
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
|
|
|
|