From fb0cd64a795716982c591edf349b9f6d53bc348c Mon Sep 17 00:00:00 2001 From: Simon Kelly Date: Wed, 28 Aug 2024 14:03:39 +0200 Subject: [PATCH 1/2] add device_id to case transactions for easy access --- corehq/form_processor/models/cases.py | 7 ++++++- corehq/form_processor/models/forms.py | 5 +++++ corehq/form_processor/tests/test_basics.py | 5 ++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/corehq/form_processor/models/cases.py b/corehq/form_processor/models/cases.py index c697ab7ef7bc..d8abdcf4305d 100644 --- a/corehq/form_processor/models/cases.py +++ b/corehq/form_processor/models/cases.py @@ -1386,6 +1386,10 @@ def is_case_rebuild(self): def xmlns(self): return self.details.get('xmlns', None) if self.details else None + @property + def device_id(self): + return self.details.get('device_id', None) if self.details else None + @classmethod @memoized def case_rebuild_types(cls): @@ -1476,7 +1480,7 @@ def _from_form(cls, case, xform, transaction_type): server_date=xform.received_on, type=transaction_type, revoked=not xform.is_normal, - details=FormSubmissionDetail(xmlns=xform.xmlns).to_json() + details=FormSubmissionDetail(xmlns=xform.xmlns, device_id=xform.device_id).to_json() ) @classmethod @@ -1544,6 +1548,7 @@ def __eq__(self, other): class FormSubmissionDetail(CaseTransactionDetail): _type = CaseTransaction.TYPE_FORM xmlns = StringProperty() + device_id = StringProperty() class RebuildWithReason(CaseTransactionDetail): diff --git a/corehq/form_processor/models/forms.py b/corehq/form_processor/models/forms.py index 1305ad2f0149..45b5685aab33 100644 --- a/corehq/form_processor/models/forms.py +++ b/corehq/form_processor/models/forms.py @@ -637,6 +637,7 @@ def history(self): return operations @property + @memoized def metadata(self): from ..utils import clean_metadata if const.TAG_META in self.form_data: @@ -650,6 +651,10 @@ def type(self): def name(self): return self.form_data.get(const.TAG_NAME, "") + @property + def device_id(self): + return self.metadata and self.metadata.deviceID + @memoized def get_sync_token(self): from casexml.apps.phone.exceptions import MissingSyncLog diff --git a/corehq/form_processor/tests/test_basics.py b/corehq/form_processor/tests/test_basics.py index 7716a00f295f..d6e39cb9c6b7 100644 --- a/corehq/form_processor/tests/test_basics.py +++ b/corehq/form_processor/tests/test_basics.py @@ -122,12 +122,14 @@ def test_create_case(self): case_id = uuid.uuid4().hex modified_on = datetime.utcnow() xmlns = 'http://commcare.org/test_xmlns' + device_id = "a.b.c.DemoDevice" _submit_case_block( True, case_id, user_id='user1', owner_id='owner1', case_type='demo', case_name='create_case', date_modified=modified_on, date_opened=modified_on, update={ 'dynamic': '123' }, - xmlns=xmlns + xmlns=xmlns, + device_id=device_id ) case = self.casedb.get_case(case_id, DOMAIN) @@ -149,6 +151,7 @@ def test_create_case(self): transactions = case.get_form_transactions() self.assertEqual(1, len(transactions)) self.assertEqual(transactions[0].xmlns, xmlns) + self.assertEqual(transactions[0].device_id, device_id) def test_create_case_unicode_name(self): """ From bcd541c8e17aeb630b36364754df9500027d46f1 Mon Sep 17 00:00:00 2001 From: Simon Kelly Date: Wed, 28 Aug 2024 15:44:25 +0200 Subject: [PATCH 2/2] handle MissingFormXml --- corehq/form_processor/models/forms.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/corehq/form_processor/models/forms.py b/corehq/form_processor/models/forms.py index 45b5685aab33..cdf4f2ae5440 100644 --- a/corehq/form_processor/models/forms.py +++ b/corehq/form_processor/models/forms.py @@ -653,7 +653,10 @@ def name(self): @property def device_id(self): - return self.metadata and self.metadata.deviceID + try: + return self.metadata and self.metadata.deviceID + except MissingFormXml: + pass @memoized def get_sync_token(self):