Skip to content

Commit 8fb588e

Browse files
committed
Address review feedback
1 parent 6b10f92 commit 8fb588e

File tree

3 files changed

+83
-3
lines changed

3 files changed

+83
-3
lines changed

django_mongodb_extensions/mql_panel/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def _execute_query(self, db, collection, collection_name, operation, args_list):
110110

111111
def _flatten_single_key_dicts(self, obj):
112112
if isinstance(obj, dict):
113-
if len(obj) == 1:
113+
if len(obj) == 1 and next(iter(obj)).startswith("$"):
114114
only_value = next(iter(obj.values()))
115115
return self._flatten_single_key_dicts(only_value)
116116
return {

django_mongodb_extensions/templates/mql_panel/subtype_value.html

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,28 @@
11
{% if sub.type == "dict" %}
22
<table class="subtable">
33
{% for inner in sub.value %}
4-
<tr><th>{{ inner.key }}</th><td>{{ inner.value }}</td></tr>
4+
<tr>
5+
<th>{{ inner.key }}</th>
6+
<td>
7+
{% if inner.type %}
8+
{% include "mql_panel/subtype_value.html" with sub=inner %}
9+
{% else %}
10+
{{ inner.value }}
11+
{% endif %}
12+
</td>
13+
</tr>
514
{% endfor %}
615
</table>
716
{% elif sub.type == "list" %}
817
<ul>
918
{% for inner in sub.value %}
10-
<li>{{ inner.value }}</li>
19+
<li>
20+
{% if inner.type %}
21+
{% include "mql_panel/subtype_value.html" with sub=inner %}
22+
{% else %}
23+
{{ inner.value }}
24+
{% endif %}
25+
</li>
1126
{% endfor %}
1227
</ul>
1328
{% else %}

tests/mql_panel/test_forms.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,68 @@ def test_list_field(self):
6969
self.assertEqual(value_map[2], "69cd51ddf1a98c14c906c51e") # ObjectId string
7070
for item in result["value"]:
7171
self.assertIs(item["is_json"], False)
72+
73+
def test_list_of_embedded_dicts(self):
74+
tags = [
75+
{"name": "cool_tag", "number": 42},
76+
{"name": "other_tag", "number": 7},
77+
]
78+
result = self.form._format_cell_value(tags)
79+
self.assertEqual(result["type"], "list")
80+
self.assertIs(result["is_json"], False)
81+
for item in result["value"]:
82+
self.assertEqual(item["type"], "dict")
83+
self.assertIs(item["is_json"], False)
84+
inner_map = {inner["key"]: inner["value"] for inner in item["value"]}
85+
self.assertIn("name", inner_map)
86+
self.assertIn("number", inner_map)
87+
88+
def test_dict_with_nested_list_of_dicts(self):
89+
address = {
90+
"street": "123 Main St",
91+
"tags": [
92+
{"name": "cool_tag", "number": 42},
93+
],
94+
}
95+
result = self.form._format_cell_value(address)
96+
self.assertEqual(result["type"], "dict")
97+
self.assertIs(result["is_json"], False)
98+
items_by_key = {item["key"]: item for item in result["value"]}
99+
self.assertEqual(items_by_key["street"]["value"], "123 Main St")
100+
tags_item = items_by_key["tags"]
101+
self.assertEqual(tags_item["type"], "list")
102+
self.assertIs(tags_item["is_json"], False)
103+
first_tag = tags_item["value"][0]
104+
self.assertEqual(first_tag["type"], "dict")
105+
inner_map = {inner["key"]: inner["value"] for inner in first_tag["value"]}
106+
self.assertEqual(inner_map["name"], "cool_tag")
107+
self.assertEqual(inner_map["number"], "42")
108+
109+
def test_deeply_nested_embedded_document(self):
110+
address = {
111+
"street": "123 Main St",
112+
"tags": [
113+
{
114+
"name": "cool_tag",
115+
"number": 42,
116+
"person": {"name": "Alice"},
117+
}
118+
],
119+
}
120+
result = self.form._format_cell_value(address)
121+
self.assertEqual(result["type"], "dict")
122+
address_by_key = {item["key"]: item for item in result["value"]}
123+
tags_item = address_by_key["tags"]
124+
self.assertEqual(tags_item["type"], "list")
125+
self.assertIs(tags_item["is_json"], False)
126+
first_tag = tags_item["value"][0]
127+
self.assertEqual(first_tag["type"], "dict")
128+
self.assertIs(first_tag["is_json"], False)
129+
tag_by_key = {inner["key"]: inner for inner in first_tag["value"]}
130+
self.assertEqual(tag_by_key["name"]["value"], "cool_tag")
131+
self.assertEqual(tag_by_key["number"]["value"], "42")
132+
person_item = tag_by_key["person"]
133+
self.assertEqual(person_item["type"], "dict")
134+
self.assertIs(person_item["is_json"], False)
135+
person_map = {inner["key"]: inner["value"] for inner in person_item["value"]}
136+
self.assertEqual(person_map["name"], "Alice")

0 commit comments

Comments
 (0)