Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add support for merged select multiples in export columns register
Browse files Browse the repository at this point in the history
kelvin-muchiri committed Jan 23, 2025
1 parent db772c7 commit 8359e4a
Showing 7 changed files with 422 additions and 145 deletions.
43 changes: 33 additions & 10 deletions onadata/apps/logger/tests/models/test_instance.py
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
from datetime import datetime, timedelta
from unittest.mock import Mock, patch

from django.contrib.contenttypes.models import ContentType
from django.http.request import HttpRequest
from django.test import override_settings
from django.utils.timezone import utc
@@ -1231,8 +1232,18 @@ def test_repeat_columns_registered(self):
| | Births | births | |
"""
xform = self._publish_markdown(md, self.user, project)
metadata = MetaData.objects.get(data_type="export_columns_register")
ordered_columns = json.loads(metadata.extra_data, object_pairs_hook=OrderedDict)
register = MetaData.objects.get(
data_type="export_columns_register",
object_id=xform.pk,
content_type=ContentType.objects.get_for_model(xform),
)
# Default export columns are correctly registered
merged_multiples_columns = json.loads(
register.extra_data["merged_multiples"], object_pairs_hook=OrderedDict
)
split_multiples_columns = json.loads(
register.extra_data["split_multiples"], object_pairs_hook=OrderedDict
)
expected_columns = OrderedDict(
[
(
@@ -1246,8 +1257,8 @@ def test_repeat_columns_registered(self):
("meta/instanceID", None),
]
)
# Default export columns are correctly registered
self.assertEqual(ordered_columns, expected_columns)
self.assertEqual(merged_multiples_columns, expected_columns)
self.assertEqual(split_multiples_columns, expected_columns)

xml = (
'<?xml version="1.0" encoding="UTF-8"?>'
@@ -1279,8 +1290,13 @@ def test_repeat_columns_registered(self):
)
# Repeats are registered on creation
instance = Instance.objects.create(xml=xml, user=self.user, xform=xform)
metadata.refresh_from_db()
ordered_columns = json.loads(metadata.extra_data, object_pairs_hook=OrderedDict)
register.refresh_from_db()
merged_multiples_columns = json.loads(
register.extra_data["merged_multiples"], object_pairs_hook=OrderedDict
)
split_multiples_columns = json.loads(
register.extra_data["split_multiples"], object_pairs_hook=OrderedDict
)
expected_columns = OrderedDict(
[
(
@@ -1302,7 +1318,8 @@ def test_repeat_columns_registered(self):
]
)

self.assertEqual(ordered_columns, expected_columns)
self.assertEqual(merged_multiples_columns, expected_columns)
self.assertEqual(split_multiples_columns, expected_columns)

# Repeats are registered on update
xml = (
@@ -1344,8 +1361,13 @@ def test_repeat_columns_registered(self):
instance.xml = xml
instance.uuid = "51cb9e07-cfc7-413b-bc22-ee7adfa9dec4"
instance.save()
metadata.refresh_from_db()
ordered_columns = json.loads(metadata.extra_data, object_pairs_hook=OrderedDict)
register.refresh_from_db()
merged_multiples_columns = json.loads(
register.extra_data["merged_multiples"], object_pairs_hook=OrderedDict
)
split_multiples_columns = json.loads(
register.extra_data["split_multiples"], object_pairs_hook=OrderedDict
)
expected_columns = OrderedDict(
[
(
@@ -1373,4 +1395,5 @@ def test_repeat_columns_registered(self):
]
)

self.assertEqual(ordered_columns, expected_columns)
self.assertEqual(merged_multiples_columns, expected_columns)
self.assertEqual(split_multiples_columns, expected_columns)
6 changes: 5 additions & 1 deletion onadata/apps/viewer/models/data_dictionary.py
Original file line number Diff line number Diff line change
@@ -452,13 +452,17 @@ def create_or_update_export_register(sender, instance=None, created=False, **kwa
csv_builder.CSVDataFrameBuilder._build_ordered_columns(
instance._get_survey(), ordered_columns
)
serialized_columns = json.dumps(ordered_columns)
MetaData.objects.update_or_create(
content_type=ContentType.objects.get_for_model(instance),
object_id=instance.pk,
data_type=EXPORT_COLUMNS_REGISTER,
defaults={
"data_value": "",
"extra_data": json.dumps(ordered_columns),
"extra_data": {
"merged_multiples": serialized_columns,
"split_multiples": serialized_columns,
},
},
)

53 changes: 48 additions & 5 deletions onadata/apps/viewer/models/tests/test_data_dictionary.py
Original file line number Diff line number Diff line change
@@ -313,7 +313,15 @@ def test_cache_invalidated(self):

def test_export_columns_register_created(self):
"""Export columns register is created when form is published"""
xform = self._publish_markdown(self.registration_form, self.user)
md = """
| survey |
| | type | name | label |
| | text | name | First Name |
| settings| | | |
| | form_title | form_id | |
| | Students | students | |
"""
xform = self._publish_markdown(md, self.user)
content_type = ContentType.objects.get_for_model(xform)
exists = MetaData.objects.filter(
data_type="export_columns_register",
@@ -323,6 +331,27 @@ def test_export_columns_register_created(self):

self.assertTrue(exists)

register = MetaData.objects.get(
data_type="export_columns_register",
object_id=xform.pk,
content_type=content_type,
)
merged_multiples_columns = json.loads(
register.extra_data["merged_multiples"], object_pairs_hook=OrderedDict
)
split_multiples_columns = json.loads(
register.extra_data["split_multiples"], object_pairs_hook=OrderedDict
)
expected_columns = OrderedDict(
[
("name", None),
("meta/instanceID", None),
]
)

self.assertEqual(merged_multiples_columns, expected_columns)
self.assertEqual(split_multiples_columns, expected_columns)

@patch("onadata.apps.logger.tasks.reconstruct_xform_export_register_async.delay")
def test_export_columns_register_updated(self, mock_register_xform_columns):
"""Export columns register is updated when form is replaced"""
@@ -341,14 +370,21 @@ def test_export_columns_register_updated(self, mock_register_xform_columns):
object_id=xform.pk,
content_type=content_type,
)
ordered_columns = json.loads(register.extra_data, object_pairs_hook=OrderedDict)
merged_multiples_columns = json.loads(
register.extra_data["merged_multiples"], object_pairs_hook=OrderedDict
)
split_multiples_columns = json.loads(
register.extra_data["split_multiples"], object_pairs_hook=OrderedDict
)
expected_columns = OrderedDict(
[
("name", None),
("meta/instanceID", None),
]
)
self.assertEqual(ordered_columns, expected_columns)

self.assertEqual(merged_multiples_columns, expected_columns)
self.assertEqual(split_multiples_columns, expected_columns)
# Replace form
md = """
| survey |
@@ -361,14 +397,21 @@ def test_export_columns_register_updated(self, mock_register_xform_columns):
"""
self._replace_form(md, xform)
register.refresh_from_db()
ordered_columns = json.loads(register.extra_data, object_pairs_hook=OrderedDict)
merged_multiples_columns = json.loads(
register.extra_data["merged_multiples"], object_pairs_hook=OrderedDict
)
split_multiples_columns = json.loads(
register.extra_data["split_multiples"], object_pairs_hook=OrderedDict
)
expected_columns = OrderedDict(
[
("name", None),
("age", None),
("meta/instanceID", None),
]
)
self.assertEqual(ordered_columns, expected_columns)

self.assertEqual(merged_multiples_columns, expected_columns)
self.assertEqual(split_multiples_columns, expected_columns)
# Task is called to add columns for repeat data
mock_register_xform_columns.assert_called_once_with(xform.pk)
Loading

0 comments on commit 8359e4a

Please sign in to comment.