Skip to content

Commit

Permalink
[ADD] connector_carepoint: Patient & Address export logic
Browse files Browse the repository at this point in the history
* Improve existing patient export
* Add tests for patient importer/exporter
* Add abstract address export logic
* Add patient address export logic
  • Loading branch information
lasley committed Sep 14, 2016
1 parent c889389 commit f8e1a9e
Show file tree
Hide file tree
Showing 6 changed files with 257 additions and 19 deletions.
8 changes: 6 additions & 2 deletions connector_carepoint/consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ def delay_export(session, model_name, record_id, vals):
export_record.delay(session, model_name, record_id, fields=fields)


@on_record_write(model_names=['carepoint.address',
@on_record_write(model_names=['medical.patient',
'carepoint.address',
'carepoint.address.patient',
])
def delay_export_all_bindings(session, model_name, record_id, vals):
""" Delay a job which export all the bindings of a record.
Expand All @@ -47,7 +49,9 @@ def delay_export_all_bindings(session, model_name, record_id, vals):
fields=fields)


@on_record_create(model_names=['carepoint.address',
@on_record_create(model_names=['medical.patient',
'carepoint.address',
'carepoint.address.patient',
])
def delay_create(session, model_name, record_id, vals):
""" Create a new binding record, then trigger delayed export
Expand Down
40 changes: 39 additions & 1 deletion connector_carepoint/models/address_patient.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

import logging
from openerp import models, fields
from openerp import models, fields, api
from openerp.addons.connector.connector import ConnectorUnit
from openerp.addons.connector.unit.mapper import (mapping,
only_create,
Expand All @@ -14,6 +14,8 @@

from .address_abstract import (CarepointAddressAbstractImportMapper,
CarepointAddressAbstractImporter,
CarepointAddressAbstractExportMapper,
CarepointAddressAbstractExporter,
)

_logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -49,6 +51,11 @@ class CarepointAddressPatient(models.Model):
string='Carepoint Bindings',
)

@api.model
def _default_res_model(self):
""" It returns the res model. """
return 'medical.patient'


@carepoint
class CarepointAddressPatientAdapter(CarepointCRUDAdapter):
Expand Down Expand Up @@ -81,6 +88,16 @@ def partner_id(self, record):
record, patient_id,
)

@mapping
@only_create
def res_model_and_id(self, record):
binder = self.binder_for('carepoint.medical.patient')
patient_id = binder.to_odoo(record['pat_id'], browse=True)
_sup = super(CarepointAddressPatientImportMapper, self)
return _sup.res_model_and_id(
record, patient_id,
)

@mapping
def carepoint_id(self, record):
return {'carepoint_id': '%d,%d' % (record['pat_id'],
Expand Down Expand Up @@ -111,3 +128,24 @@ def _import_addresses(self, patient_id, partner_binding):
address_ids = adapter.search(pat_id=patient_id)
for address_id in address_ids:
importer.run(address_id)


@carepoint
class CarepointAddressPatientExportMapper(
CarepointAddressAbstractExportMapper
):
_model_name = 'carepoint.carepoint.address.patient'

@mapping
def pat_id(self, binding):
binder = self.binder_for('carepoint.medical.patient')
rec_id = binder.to_backend(binding.res_id)
return {'pat_id': rec_id}


@carepoint
class CarepointAddressPatientExporter(
CarepointAddressAbstractExporter
):
_model_name = 'carepoint.carepoint.address.patient'
_base_mapper = CarepointAddressPatientExportMapper
38 changes: 32 additions & 6 deletions connector_carepoint/models/medical_patient.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from ..unit.import_synchronizer import (DelayedBatchImporter,
CarepointImporter,
)
from ..unit.export_synchronizer import (CarepointExporter)
from ..unit.export_synchronizer import CarepointExporter

from .address_patient import CarepointAddressPatientUnit

Expand Down Expand Up @@ -76,8 +76,13 @@ class MedicalPatientImportMapper(PersonImportMapper):
(trim('email'), 'email'),
('birth_date', 'dob'),
('death_date', 'dod'),
('pat_status_cn', 'active'),
]

@mapping
def safety_cap_yn(self, record):
return {'safety_caps_yn': not record['no_safety_caps_yn']}

@mapping
def gender(self, record):
gender = record.get('gender_cd')
Expand Down Expand Up @@ -124,19 +129,40 @@ class MedicalPatientExportMapper(PersonExportMapper):
('email', 'email'),
('dob', 'birth_date'),
('dod', 'death_date'),
('active', 'pat_status_cn')
]

@mapping
def pat_id(self, record):
return {'pat_id': record.carepoint_id}

@mapping
@changed_by('gender')
def gender_cd(self, record):
return {'gender_cd': record.get('gender').upper()}
if record.gender:
return {'gender_cd': record.gender.upper()}

@mapping
def static_defaults(self, record):
""" It provides all static default mappings """
return {
'pat_type_cn': 1,
'bad_check_yn': 0,
'app_flags': 0,
'comp_cn': 0,
'status_cn': 0,
}

@mapping
@changed_by('safety_cap_yn')
def no_safety_caps_yn(self, record):
return {'no_safety_caps_yn': not record.safety_cap_yn}


@carepoint
class MedicalPatientExporter(CarepointExporter):
_model_name = ['carepoint.medical.patient']
_base_mapper = MedicalPatientExportMapper

def _after_export(self):
self.env['carepoint.address.patient']._get_by_partner(
self.binding_record.commercial_partner_id,
edit=True,
recurse=True,
)
1 change: 1 addition & 0 deletions connector_carepoint/tests/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@
from . import test_address_patient
from . import test_address_store
from . import test_address_organization
from . import test_medical_patient
47 changes: 37 additions & 10 deletions connector_carepoint/tests/models/test_address_patient.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,7 @@ def setUp(self):
@mock.patch('%s.CarepointAddressAbstractImporter' % _file,
spec=address_patient.CarepointAddressAbstractImporter,
)
def test_import_dependencies_super(self, _super):
""" It should call the super """
_super()._import_dependencies.side_effect = EndTestException
with self.assertRaises(EndTestException):
self.unit._import_dependencies()

@mock.patch('%s.CarepointAddressAbstractImporter' % _file,
spec=address_patient.CarepointAddressAbstractImporter,
)
def test_import_dependencies_super(self, _super):
def test_import_dependencies_import(self, _super):
""" It should import all dependencies """
with mock.patch.object(self.unit, '_import_dependency') as mk:
self.unit._import_dependencies()
Expand Down Expand Up @@ -139,3 +130,39 @@ def test_import_addresses_import(self):
mk().search.return_value = [expect]
self.unit._import_addresses(1, None)
mk().run.assert_called_once_with(expect)


class TestAddressPatientExportMapper(AddressPatientTestBase):

def setUp(self):
super(TestAddressPatientExportMapper, self).setUp()
self.Unit = address_patient.CarepointAddressPatientExportMapper
self.unit = self.Unit(self.mock_env)
self.record = mock.MagicMock()

def test_pat_id_get_binder(self):
""" It should get binder for prescription line """
with mock.patch.object(self.unit, 'binder_for'):
self.unit.binder_for.side_effect = EndTestException
with self.assertRaises(EndTestException):
self.unit.pat_id(self.record)
self.unit.binder_for.assert_called_once_with(
'carepoint.medical.patient'
)

def test_pat_id_to_backend(self):
""" It should get backend record for rx """
with mock.patch.object(self.unit, 'binder_for'):
self.unit.binder_for().to_backend.side_effect = EndTestException
with self.assertRaises(EndTestException):
self.unit.pat_id(self.record)
self.unit.binder_for().to_backend.assert_called_once_with(
self.record.res_id,
)

def test_pat_id_return(self):
""" It should return formatted pat_id """
with mock.patch.object(self.unit, 'binder_for'):
res = self.unit.pat_id(self.record)
expect = self.unit.binder_for().to_backend()
self.assertDictEqual({'pat_id': expect}, res)
142 changes: 142 additions & 0 deletions connector_carepoint/tests/models/test_medical_patient.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# -*- coding: utf-8 -*-
# Copyright 2015-2016 LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

import mock

from openerp.addons.connector_carepoint.models import medical_patient

from ..common import SetUpCarepointBase


class EndTestException(Exception):
pass


class MedicalPatientTestBase(SetUpCarepointBase):

def setUp(self):
super(MedicalPatientTestBase, self).setUp()
self.model = 'carepoint.medical.patient'
self.mock_env = self.get_carepoint_helper(
self.model
)
self.record = {
'no_safety_caps_yn': True,
'pat_id': 1,
'gender_cd': 'M',
'birth_date': '2016-09-10',
'fname': 'FirstName',
'lname': 'LastName',
}


class TestMedicalPatientImportMapper(MedicalPatientTestBase):

def setUp(self):
super(TestMedicalPatientImportMapper, self).setUp()
self.Unit = medical_patient.MedicalPatientImportMapper
self.unit = self.Unit(self.mock_env)

def _create_patient(self):
return self.env['medical.patient'].create({
'name': '%s %s' % (self.record['fname'],
self.record['lname']),
'dob': self.record['birth_date'],
})

def test_safety_caps_yn(self):
""" It should return proper dict vals """
self.assertDictEqual(
{'safety_caps_yn': False},
self.unit.safety_cap_yn(self.record),
)

def test_gender_exist(self):
""" It should return lowercase gender code """
self.assertDictEqual(
{'gender': self.record['gender_cd'].lower()},
self.unit.gender(self.record)
)

def test_gender_none(self):
""" It should return None when no gender """
self.record['gender_cd'] = False
self.assertDictEqual(
{'gender': None},
self.unit.gender(self.record)
)

def test_carepoint_id(self):
""" It should return lowercase gender code """
self.assertDictEqual(
{'carepoint_id': self.record['pat_id']},
self.unit.carepoint_id(self.record)
)

def test_odoo_id(self):
""" It should return odoo_id of patient with same name """
expect = self._create_patient()
res = self.unit.odoo_id(self.record)
expect = {'odoo_id': expect.id}
self.assertDictEqual(expect, res)


class TestMedicalPatientImporter(MedicalPatientTestBase):

def setUp(self):
super(TestMedicalPatientImporter, self).setUp()
self.Unit = medical_patient.MedicalPatientImporter
self.unit = self.Unit(self.mock_env)
self.unit.carepoint_record = self.record

def test_after_import_get_unit(self):
""" It should get unit for address importer """
expect = mock.MagicMock()
with mock.patch.object(self.unit, 'unit_for'):
self.unit._after_import(expect)
self.unit.unit_for.assert_called_once_with(
medical_patient.CarepointAddressPatientUnit,
model='carepoint.carepoint.address.patient',
)

def test_after_import_get_unit(self):
""" It should get unit for address importer """
expect = mock.MagicMock()
with mock.patch.object(self.unit, 'unit_for'):
self.unit._after_import(expect)
self.unit.unit_for()._import_addresses.assert_called_once_with(
self.unit.carepoint_id,
expect,
)


class TestMedicalPatientExportMapper(MedicalPatientTestBase):

def setUp(self):
super(TestMedicalPatientExportMapper, self).setUp()
self.Unit = medical_patient.MedicalPatientExportMapper
self.unit = self.Unit(self.mock_env)
self.record = mock.MagicMock()

def test_gender_cd(self):
""" It should return proper export vals dict """
self.assertDictEqual(
{'gender_cd': self.record.gender.upper()},
self.unit.gender_cd(self.record),
)

def test_static_defaults(self):
""" It should return a dict of default values """
self.assertIsInstance(
self.unit.static_defaults(self.record),
dict,
)

def test_no_safety_caps_yn(self):
""" It should return negated safety_caps """
self.assertFalse(
self.unit.no_safety_caps_yn(self.record)[
'no_safety_caps_yn'
],
)

0 comments on commit f8e1a9e

Please sign in to comment.