Skip to content

Commit a924ac8

Browse files
committed
consistency in naming
1 parent dcc6168 commit a924ac8

File tree

8 files changed

+148
-75
lines changed

8 files changed

+148
-75
lines changed

django_mongodb_backend/fields/embedded_model_array.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
from django.db.models import Field
22

3-
from ..forms import EmbeddedModelArrayFormField
3+
from .. import forms
44
from . import EmbeddedModelField
55
from .array import ArrayField
66

77

88
class EmbeddedModelArrayField(ArrayField):
9-
def __init__(self, model, **kwargs):
10-
super().__init__(EmbeddedModelField(model), **kwargs)
11-
self.embedded_model = model
9+
def __init__(self, embedded_model, **kwargs):
10+
super().__init__(EmbeddedModelField(embedded_model), **kwargs)
11+
self.embedded_model = embedded_model
1212

1313
def deconstruct(self):
1414
name, path, args, kwargs = super().deconstruct()
15-
if path == "django_mongodb_backend.fields.multiple_embedded_model.EmbeddedModelArrayField":
15+
if path == "django_mongodb_backend.fields.embedded_model_array.EmbeddedModelArrayField":
1616
path = "django_mongodb_backend.fields.EmbeddedModelArrayField"
1717
kwargs.update(
1818
{
19-
"model": self.base_field.embedded_model,
20-
"size": self.size,
19+
"embedded_model": self.embedded_model,
2120
}
2221
)
2322
del kwargs["base_field"]
@@ -33,7 +32,7 @@ def formfield(self, **kwargs):
3332
return Field.formfield(
3433
self,
3534
**{
36-
"form_class": EmbeddedModelArrayFormField,
35+
"form_class": forms.EmbeddedModelArrayField,
3736
"model": self.base_field.embedded_model,
3837
"max_length": self.max_size,
3938
"prefix": self.name,

django_mongodb_backend/forms/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from .fields import (
2-
EmbeddedModelArrayFormField,
2+
EmbeddedModelArrayField,
33
EmbeddedModelField,
44
ObjectIdField,
55
SimpleArrayField,
@@ -8,7 +8,7 @@
88
)
99

1010
__all__ = [
11-
"EmbeddedModelArrayFormField",
11+
"EmbeddedModelArrayField",
1212
"EmbeddedModelField",
1313
"SimpleArrayField",
1414
"SplitArrayField",

django_mongodb_backend/forms/fields/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from .array import SimpleArrayField, SplitArrayField, SplitArrayWidget
22
from .embedded_model import EmbeddedModelField
3-
from .embedded_model_array import EmbeddedModelArrayFormField
3+
from .embedded_model_array import EmbeddedModelArrayField
44
from .objectid import ObjectIdField
55

66
__all__ = [
7-
"EmbeddedModelArrayFormField",
7+
"EmbeddedModelArrayField",
88
"EmbeddedModelField",
99
"SimpleArrayField",
1010
"SplitArrayField",

django_mongodb_backend/forms/fields/embedded_model_array.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def models_to_dicts(models):
1313
return [model_to_dict(model) for model in models or []]
1414

1515

16-
class EmbeddedModelArrayFormField(forms.Field):
16+
class EmbeddedModelArrayField(forms.Field):
1717
def __init__(self, model, prefix, max_length=None, length=None, *args, **kwargs):
1818
self.model = model
1919
self.prefix = prefix
@@ -23,7 +23,7 @@ def __init__(self, model, prefix, max_length=None, length=None, *args, **kwargs)
2323
max_num=max_length,
2424
extra=3,
2525
)
26-
kwargs["widget"] = MultipleEmbeddedModelWidget()
26+
kwargs["widget"] = EmbeddedModelArrayWidget()
2727
super().__init__(*args, **kwargs)
2828

2929
def clean(self, value):
@@ -47,10 +47,10 @@ def has_changed(self, initial, data):
4747
return formset.has_changed()
4848

4949
def get_bound_field(self, form, field_name):
50-
return MultipleEmbeddedModelBoundField(form, self, field_name)
50+
return EmbeddedModelArrayBoundField(form, self, field_name)
5151

5252

53-
class MultipleEmbeddedModelBoundField(forms.BoundField):
53+
class EmbeddedModelArrayBoundField(forms.BoundField):
5454
def __init__(self, form, field, name):
5555
super().__init__(form, field, name)
5656
self.formset = field.formset(
@@ -66,7 +66,7 @@ def __str__(self):
6666
return format_html("<table>\n{}\n</table>\n{}", body, self.formset.management_form)
6767

6868

69-
class MultipleEmbeddedModelWidget(forms.Widget):
69+
class EmbeddedModelArrayWidget(forms.Widget):
7070
"""
7171
This widget extracts the data for EmbeddedModelArrayFormField's formset.
7272
It is never rendered.

tests/model_fields_/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def __str__(self):
150150
return self.name
151151

152152

153-
# ArrayField + EmbeddedModelField
153+
# EmbeddedModelArrayField
154154
class Review(EmbeddedModel):
155155
title = models.CharField(max_length=255)
156156
rating = models.DecimalField(max_digits=6, decimal_places=1)

tests/model_fields_/test_embedded_model.py

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import operator
22
from datetime import timedelta
33

4-
from django.core.exceptions import FieldDoesNotExist, FieldError, ValidationError
4+
from django.core.exceptions import FieldDoesNotExist, ValidationError
55
from django.db import models
66
from django.db.models import (
77
Exists,
@@ -24,9 +24,7 @@
2424
Data,
2525
Holder,
2626
Library,
27-
Movie,
2827
NestedData,
29-
Review,
3028
)
3129
from .utils import truncate_ms
3230

@@ -98,60 +96,6 @@ def test_pre_save(self):
9896
self.assertGreater(obj.data.auto_now, auto_now_two)
9997

10098

101-
class EmbeddedArrayTests(TestCase):
102-
def test_save_load(self):
103-
reviews = [
104-
Review(title="The best", rating=10),
105-
Review(title="Mediocre", rating=5),
106-
Review(title="Horrible", rating=1),
107-
]
108-
Movie.objects.create(title="Lion King", reviews=reviews)
109-
movie = Movie.objects.get(title="Lion King")
110-
self.assertEqual(movie.reviews[0].title, "The best")
111-
self.assertEqual(movie.reviews[0].rating, 10)
112-
self.assertEqual(movie.reviews[1].title, "Mediocre")
113-
self.assertEqual(movie.reviews[1].rating, 5)
114-
self.assertEqual(movie.reviews[2].title, "Horrible")
115-
self.assertEqual(movie.reviews[2].rating, 1)
116-
self.assertEqual(len(movie.reviews), 3)
117-
118-
def test_save_load_null(self):
119-
movie = Movie.objects.create(title="Lion King")
120-
movie = Movie.objects.get(title="Lion King")
121-
self.assertIsNone(movie.reviews)
122-
123-
124-
class EmbeddedArrayQueryingTests(TestCase):
125-
@classmethod
126-
def setUpTestData(cls):
127-
reviews = [
128-
Review(title="The best", rating=10),
129-
Review(title="Mediocre", rating=5),
130-
Review(title="Horrible", rating=1),
131-
]
132-
cls.clouds = Movie.objects.create(title="Clouds", reviews=reviews)
133-
reviews = [
134-
Review(title="Super", rating=9),
135-
Review(title="Meh", rating=5),
136-
Review(title="Horrible", rating=2),
137-
]
138-
cls.frozen = Movie.objects.create(title="Frozen", reviews=reviews)
139-
reviews = [
140-
Review(title="Excellent", rating=9),
141-
Review(title="Wow", rating=8),
142-
Review(title="Classic", rating=7),
143-
]
144-
cls.bears = Movie.objects.create(title="Bears", reviews=reviews)
145-
146-
def test_filter_with_field(self):
147-
msg = (
148-
"Unsupported lookup 'title' for EmbeddedModelArrayField or join "
149-
"on the field not permitted."
150-
)
151-
with self.assertRaisesMessage(FieldError, msg):
152-
Movie.objects.filter(reviews__title="Horrible")
153-
154-
15599
class QueryingTests(TestCase):
156100
@classmethod
157101
def setUpTestData(cls):
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
from django.core.exceptions import FieldError, ValidationError
2+
from django.db import models
3+
from django.test import SimpleTestCase, TestCase
4+
from django.test.utils import isolate_apps
5+
6+
from django_mongodb_backend.fields import EmbeddedModelArrayField
7+
from django_mongodb_backend.models import EmbeddedModel
8+
9+
from .models import (
10+
Data,
11+
Holder,
12+
Movie,
13+
Review,
14+
)
15+
16+
17+
class MethodTests(SimpleTestCase):
18+
def test_deconstruct(self):
19+
field = EmbeddedModelArrayField("Data", null=True)
20+
name, path, args, kwargs = field.deconstruct()
21+
self.assertEqual(path, "django_mongodb_backend.fields.EmbeddedModelArrayField")
22+
self.assertEqual(args, [])
23+
self.assertEqual(kwargs, {"embedded_model": "Data", "null": True})
24+
25+
def test_get_db_prep_save_invalid(self):
26+
msg = "Expected instance of type <class 'model_fields_.models.Data'>, " "not <class 'int'>."
27+
with self.assertRaisesMessage(TypeError, msg):
28+
Holder(data=42).save()
29+
30+
def test_validate(self):
31+
obj = Holder(data=Data(integer=None))
32+
# This isn't quite right because "integer" is the subfield of data
33+
# that's non-null.
34+
msg = "{'data': ['This field cannot be null.']}"
35+
with self.assertRaisesMessage(ValidationError, msg):
36+
obj.full_clean()
37+
38+
39+
class ModelTests(TestCase):
40+
def test_save_load(self):
41+
reviews = [
42+
Review(title="The best", rating=10),
43+
Review(title="Mediocre", rating=5),
44+
Review(title="Horrible", rating=1),
45+
]
46+
Movie.objects.create(title="Lion King", reviews=reviews)
47+
movie = Movie.objects.get(title="Lion King")
48+
self.assertEqual(movie.reviews[0].title, "The best")
49+
self.assertEqual(movie.reviews[0].rating, 10)
50+
self.assertEqual(movie.reviews[1].title, "Mediocre")
51+
self.assertEqual(movie.reviews[1].rating, 5)
52+
self.assertEqual(movie.reviews[2].title, "Horrible")
53+
self.assertEqual(movie.reviews[2].rating, 1)
54+
self.assertEqual(len(movie.reviews), 3)
55+
56+
def test_save_load_null(self):
57+
movie = Movie.objects.create(title="Lion King")
58+
movie = Movie.objects.get(title="Lion King")
59+
self.assertIsNone(movie.reviews)
60+
61+
62+
class QueryingTests(TestCase):
63+
@classmethod
64+
def setUpTestData(cls):
65+
reviews = [
66+
Review(title="The best", rating=10),
67+
Review(title="Mediocre", rating=5),
68+
Review(title="Horrible", rating=1),
69+
]
70+
cls.clouds = Movie.objects.create(title="Clouds", reviews=reviews)
71+
reviews = [
72+
Review(title="Super", rating=9),
73+
Review(title="Meh", rating=5),
74+
Review(title="Horrible", rating=2),
75+
]
76+
cls.frozen = Movie.objects.create(title="Frozen", reviews=reviews)
77+
reviews = [
78+
Review(title="Excellent", rating=9),
79+
Review(title="Wow", rating=8),
80+
Review(title="Classic", rating=7),
81+
]
82+
cls.bears = Movie.objects.create(title="Bears", reviews=reviews)
83+
84+
def test_filter_with_field(self):
85+
msg = (
86+
"Unsupported lookup 'title' for EmbeddedModelArrayField or join "
87+
"on the field not permitted."
88+
)
89+
with self.assertRaisesMessage(FieldError, msg):
90+
Movie.objects.filter(reviews__title="Horrible")
91+
92+
93+
@isolate_apps("model_fields_")
94+
class CheckTests(SimpleTestCase):
95+
def test_no_relational_fields(self):
96+
class Target(EmbeddedModel):
97+
key = models.ForeignKey("MyModel", models.CASCADE)
98+
99+
class MyModel(models.Model):
100+
field = EmbeddedModelArrayField(Target)
101+
102+
errors = MyModel().check()
103+
self.assertEqual(len(errors), 1)
104+
self.assertEqual(errors[0].id, "django_mongodb_backend.array.E001")
105+
msg = errors[0].msg
106+
self.assertEqual(
107+
msg,
108+
"Base field for array has errors:\n "
109+
"Embedded models cannot have relational fields (Target.key is a ForeignKey). "
110+
"(django_mongodb_backend.embedded_model.E001)",
111+
)
112+
113+
def test_embedded_model_subclass(self):
114+
class Target(models.Model):
115+
pass
116+
117+
class MyModel(models.Model):
118+
field = EmbeddedModelArrayField(Target)
119+
120+
errors = MyModel().check()
121+
self.assertEqual(len(errors), 1)
122+
self.assertEqual(errors[0].id, "django_mongodb_backend.array.E001")
123+
msg = errors[0].msg
124+
self.assertEqual(
125+
msg,
126+
"Base field for array has errors:\n "
127+
"Embedded models must be a subclass of "
128+
"django_mongodb_backend.models.EmbeddedModel. "
129+
"(django_mongodb_backend.embedded_model.E002)",
130+
)

0 commit comments

Comments
 (0)