diff --git a/corehq/apps/case_importer/static/case_importer/js/excel_fields.js b/corehq/apps/case_importer/static/case_importer/js/excel_fields.js index 9d5f7f1e1605..dd821f3206a6 100644 --- a/corehq/apps/case_importer/static/case_importer/js/excel_fields.js +++ b/corehq/apps/case_importer/static/case_importer/js/excel_fields.js @@ -10,7 +10,8 @@ hqDefine('case_importer/js/excel_fields', [ _, levenshtein ) { - function excelFieldRows(excelFields, caseFieldSpecs) { + function excelFieldRows(excelFields, caseFieldSpecs, systemFields) { + systemFields = _(systemFields); var self = { excelFields: excelFields, caseFieldSpecs: caseFieldSpecs, @@ -30,6 +31,9 @@ hqDefine('case_importer/js/excel_fields', [ customCaseField: ko.observable(excelField), isCustom: ko.observable(false), }; + row.hasValue = ko.computed(function () { + return row.isCustom() || row.selectedCaseField(); + }); row.selectedCaseFieldOrBlank = ko.computed({ read: function () { return row.isCustom() ? '' : row.selectedCaseField(); @@ -63,12 +67,6 @@ hqDefine('case_importer/js/excel_fields', [ row.valuesHints = ko.computed(function () { return row.caseFieldSpec().values_hints || []; }); - row.createNewChecked = ko.computed({ - read: function () { - return _.isEmpty(row.caseFieldSpec()); - }, - write: row.isCustom, - }); row.isDeprecated = ko.computed(function () { return row.caseFieldSpec().deprecated === true; }); @@ -81,7 +79,7 @@ hqDefine('case_importer/js/excel_fields', [ row.isCustom(false); row.selectedCaseField(field); } else { - row.isCustom(true); + row.isCustom(!systemFields.contains(field)); row.selectedCaseField(null); } }; @@ -102,6 +100,9 @@ hqDefine('case_importer/js/excel_fields', [ }); return _.chain(suggestions).sortBy('distance').pluck('field').value(); }); + row.isSystemProperty = ko.computed(function () { + return row.isCustom() && systemFields.contains(row.customCaseField()); + }); self.mappingRows.push(row); }; diff --git a/corehq/apps/case_importer/static/case_importer/js/main.js b/corehq/apps/case_importer/static/case_importer/js/main.js index c8c903761f8c..3576e748cff1 100644 --- a/corehq/apps/case_importer/static/case_importer/js/main.js +++ b/corehq/apps/case_importer/static/case_importer/js/main.js @@ -61,6 +61,7 @@ hqDefine("case_importer/js/main", [ var behaviorForExcelMappingPage = function () { var excelFields = initialPageData.get('excel_fields'); var caseFieldSpecs = initialPageData.get('case_field_specs'); + var systemFields = initialPageData.get('system_fields'); if (!excelFields && !caseFieldSpecs) { // We're not on the excel mapping page return; @@ -78,7 +79,7 @@ hqDefine("case_importer/js/main", [ return; } - var excelFieldRows = excelFieldsModule.excelFieldRowsModel(excelFields, caseFieldSpecs); + var excelFieldRows = excelFieldsModule.excelFieldRowsModel(excelFields, caseFieldSpecs, systemFields); $('#excel-field-rows').koApplyBindings(excelFieldRows); $('#js-add-mapping').click(function (e) { diff --git a/corehq/apps/case_importer/suggested_fields.py b/corehq/apps/case_importer/suggested_fields.py index 7db372bec54f..5b8c3c8c6032 100644 --- a/corehq/apps/case_importer/suggested_fields.py +++ b/corehq/apps/case_importer/suggested_fields.py @@ -9,6 +9,7 @@ ) from corehq.apps.case_importer.util import RESERVED_FIELDS from corehq.apps.data_dictionary.util import get_values_hints_dict, get_deprecated_fields +from corehq.apps.export.system_properties import MAIN_CASE_TABLE_PROPERTIES from corehq.toggles import BULK_UPLOAD_DATE_OPENED @@ -115,3 +116,8 @@ def get_special_fields(domain=None): ) ) return special_fields + + +def get_non_discoverable_system_properties(): + discoverable = {s.field for s in get_special_fields() if s.description and s.discoverable} + return [p.label for p in MAIN_CASE_TABLE_PROPERTIES if p.label not in discoverable] diff --git a/corehq/apps/case_importer/templates/case_importer/excel_config.html b/corehq/apps/case_importer/templates/case_importer/excel_config.html index 5e4246d928b5..8fee156c1731 100644 --- a/corehq/apps/case_importer/templates/case_importer/excel_config.html +++ b/corehq/apps/case_importer/templates/case_importer/excel_config.html @@ -84,7 +84,7 @@
+ {% if request|toggle_enabled:"CASE_IMPORT_DATA_DICTIONARY_VALIDATION" %} diff --git a/corehq/apps/case_importer/tests/test_suggested_fields.py b/corehq/apps/case_importer/tests/test_suggested_fields.py index 0c5c652acdce..a493f1a8319c 100644 --- a/corehq/apps/case_importer/tests/test_suggested_fields.py +++ b/corehq/apps/case_importer/tests/test_suggested_fields.py @@ -6,6 +6,7 @@ from corehq.apps.case_importer.suggested_fields import ( FieldSpec, get_suggested_case_fields, + get_non_discoverable_system_properties, ) from corehq.util.test_utils import DocTestMixin @@ -68,3 +69,26 @@ def test_basic_inclusion_and_sorting(self): FieldSpec(field='weight', show_in_menu=True), ] ) + + +class TestSystemProperties(SimpleTestCase): + + def test_get_non_discoverable_system_properties(self): + self.assertEqual(get_non_discoverable_system_properties(), [ + 'number', + 'caseid', + 'case_type', + 'closed', + 'closed_by_user_id', + 'closed_by_username', + 'closed_date', + 'last_modified_by_user_id', + 'last_modified_by_user_username', + 'last_modified_date', + 'opened_by_user_id', + 'opened_by_username', + 'opened_date', + 'server_last_modified_date', + 'state', + 'case_link', + ]) diff --git a/corehq/apps/case_importer/views.py b/corehq/apps/case_importer/views.py index 635369125901..66760512d2b2 100644 --- a/corehq/apps/case_importer/views.py +++ b/corehq/apps/case_importer/views.py @@ -32,6 +32,7 @@ ) from corehq.apps.case_importer.suggested_fields import ( get_suggested_case_fields, + get_non_discoverable_system_properties, ) from corehq.apps.case_importer.tracking.case_upload_tracker import CaseUpload from corehq.apps.case_importer.util import ( @@ -372,6 +373,7 @@ def excel_fields(request, domain): 'columns': columns, 'excel_fields': excel_fields, 'case_field_specs': case_field_specs, + 'system_fields': get_non_discoverable_system_properties(), 'domain': domain, 'mirroring_enabled': mirroring_enabled, 'is_bulk_import': request.POST.get('is_bulk_import', 'False') == 'True',