From 07688824af245c40c7bc15976ec5032d9a877757 Mon Sep 17 00:00:00 2001 From: Dave Lasley Date: Tue, 6 Sep 2016 09:35:16 -0700 Subject: [PATCH 1/2] [IMP] connector_carepoint: Abstract address on pharmacy * Implement abstract address import logic on `medical.pharmacy` --- .../models/address_pharmacy.py | 78 +++++----- connector_carepoint/tests/models/__init__.py | 1 + .../tests/models/test_address_pharmacy.py | 141 ++++++++++++++++++ 3 files changed, 177 insertions(+), 43 deletions(-) create mode 100644 connector_carepoint/tests/models/test_address_pharmacy.py diff --git a/connector_carepoint/models/address_pharmacy.py b/connector_carepoint/models/address_pharmacy.py index 01b8682..fa8488b 100644 --- a/connector_carepoint/models/address_pharmacy.py +++ b/connector_carepoint/models/address_pharmacy.py @@ -4,16 +4,17 @@ import logging from openerp import models, fields +from openerp.addons.connector.connector import ConnectorUnit from openerp.addons.connector.unit.mapper import (mapping, only_create, ) from ..unit.backend_adapter import CarepointCRUDAdapter -from ..unit.mapper import CarepointImportMapper from ..backend import carepoint -from ..unit.import_synchronizer import (DelayedBatchImporter, - CarepointImporter, - ) +from ..unit.import_synchronizer import DelayedBatchImporter +from .address_abstract import (CarepointAddressAbstractImportMapper, + CarepointAddressAbstractImporter, + ) _logger = logging.getLogger(__name__) @@ -35,19 +36,13 @@ class CarepointCarepointAddressPharmacy(models.Model): class CarepointAddressPharmacy(models.Model): - """ Adds the ``one2many`` relation to the Carepoint bindings + """ Adds the ``One2many`` relation to the Carepoint bindings (``carepoint_bind_ids``) """ - _inherits = {'carepoint.address': 'address_id'} _name = 'carepoint.address.pharmacy' + _inherit = 'carepoint.address.abstract' _description = 'Carepoint Address Pharmacy' - address_id = fields.Many2one( - string='Address', - comodel_name='carepoint.address', - required=True, - ondelete='cascade', - ) carepoint_bind_ids = fields.One2many( comodel_name='carepoint.carepoint.address.pharmacy', inverse_name='odoo_id', @@ -70,38 +65,21 @@ class CarepointAddressPharmacyBatchImporter(DelayedBatchImporter): @carepoint -class CarepointAddressPharmacyImportMapper(CarepointImportMapper): +class CarepointAddressPharmacyImportMapper( + CarepointAddressAbstractImportMapper, +): _model_name = 'carepoint.carepoint.address.pharmacy' @mapping @only_create - def parent_id(self, record): + def partner_id(self, record): + """ It returns either the commercial partner or parent & defaults """ binder = self.binder_for('carepoint.medical.pharmacy') - pharmacy_id = binder.to_odoo(record['store_id']) - partner_id = self.env['medical.pharmacy'].browse( - pharmacy_id).partner_id - return { - 'parent_id': partner_id.id, - } - - @mapping - @only_create - def partner_and_address_id(self, record): - binder = self.binder_for('carepoint.carepoint.address') - address_id = binder.to_odoo(record['addr_id']) - address_id = self.env['carepoint.address'].browse(address_id) - return { - 'partner_id': address_id.partner_id.id, - 'address_id': address_id.id, - } - - @mapping - def type(self, record): - return {'type': 'delivery'} - - @mapping - def customer(self, record): - return {'customer': False} + pharmacy_id = binder.to_odoo(record['store_id'], browse=True) + _sup = super(CarepointAddressPharmacyImportMapper, self) + return _sup.partner_id( + record, pharmacy_id, + ) @mapping def carepoint_id(self, record): @@ -110,12 +88,26 @@ def carepoint_id(self, record): @carepoint -class CarepointAddressPharmacyImporter(CarepointImporter): +class CarepointAddressPharmacyImporter( + CarepointAddressAbstractImporter, +): _model_name = ['carepoint.carepoint.address.pharmacy'] _base_mapper = CarepointAddressPharmacyImportMapper def _import_dependencies(self): """ Import depends for record """ - record = self.carepoint_record - self._import_dependency(record['addr_id'], - 'carepoint.carepoint.address') + super(CarepointAddressPharmacyImporter, self)._import_dependencies() + self._import_dependency(self.carepoint_record['store_id'], + 'carepoint.medical.pharmacy') + + +@carepoint +class CarepointAddressPharmacyUnit(ConnectorUnit): + _model_name = 'carepoint.carepoint.address.pharmacy' + + def _import_addresses(self, pharmacy_id, partner_binding): + adapter = self.unit_for(CarepointCRUDAdapter) + importer = self.unit_for(CarepointAddressPharmacyImporter) + address_ids = adapter.search(store_id=pharmacy_id) + for address_id in address_ids: + importer.run(address_id) diff --git a/connector_carepoint/tests/models/__init__.py b/connector_carepoint/tests/models/__init__.py index 50eca4f..993554f 100644 --- a/connector_carepoint/tests/models/__init__.py +++ b/connector_carepoint/tests/models/__init__.py @@ -17,3 +17,4 @@ from . import test_address_abstract from . import test_address from . import test_address_patient +from . import test_address_pharmacy diff --git a/connector_carepoint/tests/models/test_address_pharmacy.py b/connector_carepoint/tests/models/test_address_pharmacy.py new file mode 100644 index 0000000..a3f152a --- /dev/null +++ b/connector_carepoint/tests/models/test_address_pharmacy.py @@ -0,0 +1,141 @@ +# -*- 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 address_pharmacy + +from ...unit.backend_adapter import CarepointCRUDAdapter + +from ..common import SetUpCarepointBase + + +_file = 'openerp.addons.connector_carepoint.models.address_pharmacy' + + +class EndTestException(Exception): + pass + + +class AddressPharmacyTestBase(SetUpCarepointBase): + + def setUp(self): + super(AddressPharmacyTestBase, self).setUp() + self.model = 'carepoint.address.pharmacy' + self.mock_env = self.get_carepoint_helper( + self.model + ) + self.record = { + 'store_id': 1, + 'addr_id': 2, + } + + +class TestAddressPharmacyImportMapper(AddressPharmacyTestBase): + + def setUp(self): + super(TestAddressPharmacyImportMapper, self).setUp() + self.Unit = address_pharmacy.CarepointAddressPharmacyImportMapper + self.unit = self.Unit(self.mock_env) + + def test_partner_id_get_binder(self): + """ It should get binder for pharmacy """ + with mock.patch.object(self.unit, 'binder_for'): + self.unit.binder_for.side_effect = EndTestException + with self.assertRaises(EndTestException): + self.unit.partner_id(self.record) + self.unit.binder_for.assert_called_once_with( + 'carepoint.medical.pharmacy' + ) + + def test_partner_id_to_odoo(self): + """ It should get Odoo record for pharmacy """ + with mock.patch.object(self.unit, 'binder_for'): + self.unit.binder_for().to_odoo.side_effect = EndTestException + with self.assertRaises(EndTestException): + self.unit.partner_id(self.record) + self.unit.binder_for().to_odoo.assert_called_once_with( + self.record['store_id'], browse=True, + ) + + def test_carepoint_id(self): + """ It should return correct attribute """ + res = self.unit.carepoint_id(self.record) + expect = { + 'carepoint_id': '%d,%d' % ( + self.record['store_id'], + self.record['addr_id'], + ), + } + self.assertDictEqual(expect, res) + + +class TestAddressPharmacyImporter(AddressPharmacyTestBase): + + def setUp(self): + super(TestAddressPharmacyImporter, self).setUp() + self.Unit = address_pharmacy.CarepointAddressPharmacyImporter + self.unit = self.Unit(self.mock_env) + self.unit.carepoint_record = self.record + + @mock.patch('%s.CarepointAddressAbstractImporter' % _file, + spec=address_pharmacy.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_pharmacy.CarepointAddressAbstractImporter, + ) + def test_import_dependencies_super(self, _super): + """ It should import all dependencies """ + with mock.patch.object(self.unit, '_import_dependency') as mk: + self.unit._import_dependencies() + mk.assert_has_calls([ + mock.call( + self.record['store_id'], + 'carepoint.medical.pharmacy', + ), + ]) + + +class TestCarepointAddressPharmacyUnit(AddressPharmacyTestBase): + + def setUp(self): + super(TestCarepointAddressPharmacyUnit, self).setUp() + self.Unit = address_pharmacy.CarepointAddressPharmacyUnit + self.unit = self.Unit(self.mock_env) + + def test_import_addresses_unit(self): + """ It should get units for adapter and importer """ + with mock.patch.object(self.unit, 'unit_for') as mk: + mk.side_effect = [None, EndTestException] + with self.assertRaises(EndTestException): + self.unit._import_addresses(None, None) + mk.assert_has_calls([ + mock.call(CarepointCRUDAdapter), + mock.call( + address_pharmacy.CarepointAddressPharmacyImporter, + ), + ]) + + def test_import_addresses_search(self): + """ It should search adapter for filters """ + pharmacy = mock.MagicMock() + with mock.patch.object(self.unit, 'unit_for') as mk: + self.unit._import_addresses(pharmacy, None) + mk().search.assert_called_once_with( + store_id=pharmacy, + ) + + def test_import_addresses_import(self): + """ It should run importer on search results """ + expect = mock.MagicMock() + with mock.patch.object(self.unit, 'unit_for') as mk: + mk().search.return_value = [expect] + self.unit._import_addresses(1, None) + mk().run.assert_called_once_with(expect) From 3fd699a6d720dd81c5d56f6f6eab70fc75f3705e Mon Sep 17 00:00:00 2001 From: Dave Lasley Date: Tue, 6 Sep 2016 13:36:14 -0700 Subject: [PATCH 2/2] [IMP] connector_carepoint: Improved pharmacy handling * Prefer CarepointStore namespace to MedicalPharmacy in order to allow for cssorg * Bump version, previous versions of stores incompatible * Implement csorg as carepoint_organization --- connector_carepoint/README.rst | 1 + connector_carepoint/__openerp__.py | 2 +- connector_carepoint/models/__init__.py | 6 +- .../models/address_organization.py | 115 ++++++++++++++ .../{address_pharmacy.py => address_store.py} | 64 ++++---- .../models/carepoint_backend.py | 4 +- connector_carepoint/models/carepoint_item.py | 4 +- .../models/carepoint_organization.py | 141 +++++++++++++++++ ...medical_pharmacy.py => carepoint_store.py} | 65 ++++---- .../models/medical_prescription_order.py | 2 +- connector_carepoint/models/sale_order.py | 2 +- connector_carepoint/models/stock_warehouse.py | 2 +- .../security/ir.model.access.csv | 4 +- .../static/description/icon.png | Bin 32791 -> 32792 bytes .../static/description/icon.svg | 2 +- connector_carepoint/tests/models/__init__.py | 5 +- .../tests/models/test_address_organization.py | 142 ++++++++++++++++++ ...ress_pharmacy.py => test_address_store.py} | 48 +++--- .../tests/models/test_carepoint_item.py | 2 +- .../models/test_carepoint_organization.py | 98 ++++++++++++ ...al_pharmacy.py => test_carepoint_store.py} | 33 ++-- .../tests/models/test_sale_order.py | 2 +- .../tests/models/test_stock_warehouse.py | 2 +- .../tests/test_backend_adapter.py | 2 +- .../tests/test_base_exporter.py | 2 +- .../tests/test_batch_importer.py | 2 +- connector_carepoint/tests/test_binder.py | 2 +- .../tests/test_carepoint_backend.py | 6 +- .../tests/test_carepoint_deleter.py | 2 +- .../tests/test_carepoint_exporter.py | 2 +- .../tests/test_carepoint_import_mapper.py | 2 +- .../tests/test_carepoint_importer.py | 2 +- connector_carepoint/tests/test_connector.py | 2 +- connector_carepoint/tests/test_consumer.py | 4 +- .../tests/test_delayed_batch_importer.py | 2 +- .../tests/test_direct_batch_importer.py | 2 +- .../tests/test_related_action.py | 2 +- connector_carepoint/unit/binder.py | 6 +- 38 files changed, 655 insertions(+), 131 deletions(-) create mode 100644 connector_carepoint/models/address_organization.py rename connector_carepoint/models/{address_pharmacy.py => address_store.py} (53%) create mode 100644 connector_carepoint/models/carepoint_organization.py rename connector_carepoint/models/{medical_pharmacy.py => carepoint_store.py} (64%) create mode 100644 connector_carepoint/tests/models/test_address_organization.py rename connector_carepoint/tests/models/{test_address_pharmacy.py => test_address_store.py} (72%) create mode 100644 connector_carepoint/tests/models/test_carepoint_organization.py rename connector_carepoint/tests/models/{test_medical_pharmacy.py => test_carepoint_store.py} (81%) diff --git a/connector_carepoint/README.rst b/connector_carepoint/README.rst index c80abf0..bb0d8f0 100755 --- a/connector_carepoint/README.rst +++ b/connector_carepoint/README.rst @@ -67,6 +67,7 @@ Known Issues / Roadmap * Add Rx/OTC Tax delineation * ``import_dependency`` usage in ``_after_import`` should be replaced for delay * Needs to be split into multiple modules to isolate dependencies +* Carepoint organizations import as pharmacies, but might be other entities Bug Tracker diff --git a/connector_carepoint/__openerp__.py b/connector_carepoint/__openerp__.py index 6555302..3d36276 100644 --- a/connector_carepoint/__openerp__.py +++ b/connector_carepoint/__openerp__.py @@ -5,7 +5,7 @@ { 'name': 'CarePoint Connector', 'description': 'Two-Way Sync With CarePoint', - 'version': '9.0.1.0.1', + 'version': '9.0.1.2.0', 'category': 'Connector', 'author': "LasLabs", 'license': 'AGPL-3', diff --git a/connector_carepoint/models/__init__.py b/connector_carepoint/models/__init__.py index d2fc226..d58bbe6 100644 --- a/connector_carepoint/models/__init__.py +++ b/connector_carepoint/models/__init__.py @@ -15,7 +15,6 @@ from . import stock_warehouse # Medical Models -from . import medical_pharmacy from . import medical_patient from . import medical_physician from . import medical_prescription_order @@ -25,11 +24,14 @@ from . import address from . import address_abstract from . import address_patient -from . import address_pharmacy +from . import address_store +from . import address_organization from . import address_physician # CarePoint Mappings/Binds from . import account +from . import carepoint_store +from . import carepoint_organization from . import carepoint_state from . import carepoint_item from . import carepoint_vendor diff --git a/connector_carepoint/models/address_organization.py b/connector_carepoint/models/address_organization.py new file mode 100644 index 0000000..b0f0d01 --- /dev/null +++ b/connector_carepoint/models/address_organization.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# Copyright 2015-2016 LasLabs Inc. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging +from openerp import models, fields +from openerp.addons.connector.connector import ConnectorUnit +from openerp.addons.connector.unit.mapper import (mapping, + only_create, + ) +from ..unit.backend_adapter import CarepointCRUDAdapter +from ..backend import carepoint +from ..unit.import_synchronizer import DelayedBatchImporter + +from .address_abstract import (CarepointAddressAbstractImportMapper, + CarepointAddressAbstractImporter, + ) + +_logger = logging.getLogger(__name__) + + +class CarepointCarepointAddressOrganization(models.Model): + """ Binding Model for the Carepoint Address Organization """ + _name = 'carepoint.carepoint.address.organization' + _inherit = 'carepoint.binding' + _inherits = {'carepoint.address.organization': 'odoo_id'} + _description = 'Carepoint Address Organization Many2Many Rel' + _cp_lib = 'pharmacy_address' + + odoo_id = fields.Many2one( + comodel_name='carepoint.address.organization', + string='Company', + required=True, + ondelete='cascade' + ) + + +class CarepointAddressOrganization(models.Model): + """ Adds the ``One2many`` relation to the Carepoint bindings + (``carepoint_bind_ids``) + """ + _name = 'carepoint.address.organization' + _inherit = 'carepoint.address.abstract' + _description = 'Carepoint Address Organization' + + carepoint_bind_ids = fields.One2many( + comodel_name='carepoint.carepoint.address.organization', + inverse_name='odoo_id', + string='Carepoint Bindings', + ) + + +@carepoint +class CarepointAddressOrganizationAdapter(CarepointCRUDAdapter): + """ Backend Adapter for the Carepoint Address Organization """ + _model_name = 'carepoint.carepoint.address.organization' + + +@carepoint +class CarepointAddressOrganizationBatchImporter(DelayedBatchImporter): + """ Import the Carepoint Address Organizations. + For every address in the list, a delayed job is created. + """ + _model_name = ['carepoint.carepoint.address.organization'] + + +@carepoint +class CarepointAddressOrganizationImportMapper( + CarepointAddressAbstractImportMapper, +): + _model_name = 'carepoint.carepoint.address.organization' + + @mapping + @only_create + def partner_id(self, record): + """ It returns either the commercial partner or parent & defaults """ + binder = self.binder_for('carepoint.medical.organization') + organization_id = binder.to_odoo(record['org_id'], browse=True) + _sup = super(CarepointAddressOrganizationImportMapper, self) + return _sup.partner_id( + record, organization_id, + ) + + @mapping + def carepoint_id(self, record): + return {'carepoint_id': '%d,%d' % (record['org_id'], + record['addr_id'])} + + +@carepoint +class CarepointAddressOrganizationImporter( + CarepointAddressAbstractImporter, +): + _model_name = ['carepoint.carepoint.address.organization'] + _base_mapper = CarepointAddressOrganizationImportMapper + + def _import_dependencies(self): + """ Import depends for record """ + super( + CarepointAddressOrganizationImporter, self + )._import_dependencies() + self._import_dependency(self.carepoint_record['org_id'], + 'carepoint.medical.organization') + + +@carepoint +class CarepointAddressOrganizationUnit(ConnectorUnit): + _model_name = 'carepoint.carepoint.address.organization' + + def _import_addresses(self, organization_id, partner_binding): + adapter = self.unit_for(CarepointCRUDAdapter) + importer = self.unit_for(CarepointAddressOrganizationImporter) + address_ids = adapter.search(org_id=organization_id) + for address_id in address_ids: + importer.run(address_id) diff --git a/connector_carepoint/models/address_pharmacy.py b/connector_carepoint/models/address_store.py similarity index 53% rename from connector_carepoint/models/address_pharmacy.py rename to connector_carepoint/models/address_store.py index fa8488b..9492246 100644 --- a/connector_carepoint/models/address_pharmacy.py +++ b/connector_carepoint/models/address_store.py @@ -19,66 +19,66 @@ _logger = logging.getLogger(__name__) -class CarepointCarepointAddressPharmacy(models.Model): - """ Binding Model for the Carepoint Address Pharmacy """ - _name = 'carepoint.carepoint.address.pharmacy' +class CarepointCarepointAddressStore(models.Model): + """ Binding Model for the Carepoint Address Store """ + _name = 'carepoint.carepoint.address.store' _inherit = 'carepoint.binding' - _inherits = {'carepoint.address.pharmacy': 'odoo_id'} - _description = 'Carepoint Address Pharmacy Many2Many Rel' + _inherits = {'carepoint.address.store': 'odoo_id'} + _description = 'Carepoint Address Store Many2Many Rel' _cp_lib = 'store_address' # Name of model in Carepoint lib (snake_case) odoo_id = fields.Many2one( - comodel_name='carepoint.address.pharmacy', + comodel_name='carepoint.address.store', string='Company', required=True, ondelete='cascade' ) -class CarepointAddressPharmacy(models.Model): +class CarepointAddressStore(models.Model): """ Adds the ``One2many`` relation to the Carepoint bindings (``carepoint_bind_ids``) """ - _name = 'carepoint.address.pharmacy' + _name = 'carepoint.address.store' _inherit = 'carepoint.address.abstract' - _description = 'Carepoint Address Pharmacy' + _description = 'Carepoint Address Store' carepoint_bind_ids = fields.One2many( - comodel_name='carepoint.carepoint.address.pharmacy', + comodel_name='carepoint.carepoint.address.store', inverse_name='odoo_id', string='Carepoint Bindings', ) @carepoint -class CarepointAddressPharmacyAdapter(CarepointCRUDAdapter): - """ Backend Adapter for the Carepoint Address Pharmacy """ - _model_name = 'carepoint.carepoint.address.pharmacy' +class CarepointAddressStoreAdapter(CarepointCRUDAdapter): + """ Backend Adapter for the Carepoint Address Store """ + _model_name = 'carepoint.carepoint.address.store' @carepoint -class CarepointAddressPharmacyBatchImporter(DelayedBatchImporter): - """ Import the Carepoint Address Pharmacys. +class CarepointAddressStoreBatchImporter(DelayedBatchImporter): + """ Import the Carepoint Address Stores. For every address in the list, a delayed job is created. """ - _model_name = ['carepoint.carepoint.address.pharmacy'] + _model_name = ['carepoint.carepoint.address.store'] @carepoint -class CarepointAddressPharmacyImportMapper( +class CarepointAddressStoreImportMapper( CarepointAddressAbstractImportMapper, ): - _model_name = 'carepoint.carepoint.address.pharmacy' + _model_name = 'carepoint.carepoint.address.store' @mapping @only_create def partner_id(self, record): """ It returns either the commercial partner or parent & defaults """ - binder = self.binder_for('carepoint.medical.pharmacy') - pharmacy_id = binder.to_odoo(record['store_id'], browse=True) - _sup = super(CarepointAddressPharmacyImportMapper, self) + binder = self.binder_for('carepoint.carepoint.store') + store_id = binder.to_odoo(record['store_id'], browse=True) + _sup = super(CarepointAddressStoreImportMapper, self) return _sup.partner_id( - record, pharmacy_id, + record, store_id, ) @mapping @@ -88,26 +88,26 @@ def carepoint_id(self, record): @carepoint -class CarepointAddressPharmacyImporter( +class CarepointAddressStoreImporter( CarepointAddressAbstractImporter, ): - _model_name = ['carepoint.carepoint.address.pharmacy'] - _base_mapper = CarepointAddressPharmacyImportMapper + _model_name = ['carepoint.carepoint.address.store'] + _base_mapper = CarepointAddressStoreImportMapper def _import_dependencies(self): """ Import depends for record """ - super(CarepointAddressPharmacyImporter, self)._import_dependencies() + super(CarepointAddressStoreImporter, self)._import_dependencies() self._import_dependency(self.carepoint_record['store_id'], - 'carepoint.medical.pharmacy') + 'carepoint.carepoint.store') @carepoint -class CarepointAddressPharmacyUnit(ConnectorUnit): - _model_name = 'carepoint.carepoint.address.pharmacy' +class CarepointAddressStoreUnit(ConnectorUnit): + _model_name = 'carepoint.carepoint.address.store' - def _import_addresses(self, pharmacy_id, partner_binding): + def _import_addresses(self, store_id, partner_binding): adapter = self.unit_for(CarepointCRUDAdapter) - importer = self.unit_for(CarepointAddressPharmacyImporter) - address_ids = adapter.search(store_id=pharmacy_id) + importer = self.unit_for(CarepointAddressStoreImporter) + address_ids = adapter.search(store_id=store_id) for address_id in address_ids: importer.run(address_id) diff --git a/connector_carepoint/models/carepoint_backend.py b/connector_carepoint/models/carepoint_backend.py index 7c47676..0dd5e95 100644 --- a/connector_carepoint/models/carepoint_backend.py +++ b/connector_carepoint/models/carepoint_backend.py @@ -76,7 +76,7 @@ class CarepointBackend(models.Model): "in Odoo.", ) store_ids = fields.One2many( - comodel_name='carepoint.medical.pharmacy', + comodel_name='carepoint.carepoint.store', inverse_name='backend_id', string='Store', readonly=True, @@ -224,7 +224,7 @@ def check_carepoint_structure(self): def synchronize_metadata(self): session = self.__get_session() for backend in self: - for model in ('carepoint.medical.pharmacy', + for model in ('carepoint.carepoint.store', # 'carepoint.res.users', ): # import directly, do not delay because this diff --git a/connector_carepoint/models/carepoint_item.py b/connector_carepoint/models/carepoint_item.py index 167bccf..b9e5fc3 100644 --- a/connector_carepoint/models/carepoint_item.py +++ b/connector_carepoint/models/carepoint_item.py @@ -35,7 +35,7 @@ class CarepointCarepointItem(models.Model): ) store_id = fields.Many2one( string='Store', - comodel_name='carepoint.medical.pharmacy', + comodel_name='carepoint.carepoint.store', readonly=True, ) @@ -110,7 +110,7 @@ def active(self, record): @mapping def store_id(self, record): - binder = self.binder_for('carepoint.medical.pharmacy') + binder = self.binder_for('carepoint.carepoint.store') store_id = binder.to_odoo(record['store_id']) return {'store_id': store_id} diff --git a/connector_carepoint/models/carepoint_organization.py b/connector_carepoint/models/carepoint_organization.py new file mode 100644 index 0000000..e776f90 --- /dev/null +++ b/connector_carepoint/models/carepoint_organization.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +# Copyright 2015-2016 LasLabs Inc. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging +from openerp import models, fields +from openerp.addons.connector.unit.mapper import (mapping, + only_create, + ) +from ..unit.backend_adapter import CarepointCRUDAdapter +from ..unit.mapper import (PartnerImportMapper, + ExportMapper, + trim, + ) +from ..backend import carepoint +from ..unit.import_synchronizer import (DelayedBatchImporter, + CarepointImporter, + ) +from ..unit.export_synchronizer import (CarepointExporter) + +from .address_organization import CarepointAddressOrganizationUnit + +_logger = logging.getLogger(__name__) + + +class CarepointCarepointOrganization(models.Model): + """ Binding Model for the Carepoint Organization """ + _name = 'carepoint.carepoint.organization' + _inherit = 'carepoint.binding' + _inherits = {'carepoint.organization': 'odoo_id'} + _description = 'Carepoint Organization' + _cp_lib = 'pharmacy' + + odoo_id = fields.Many2one( + comodel_name='carepoint.organization', + string='Organization', + required=True, + ondelete='cascade' + ) + + +class CarepointOrganization(models.Model): + """ Adds the ``one2many`` relation to the Carepoint bindings + (``carepoint_bind_ids``) + """ + # Cannot direct bind due to store organization sync + _name = 'carepoint.organization' + _inherits = {'medical.pharmacy': 'pharmacy_id'} + + pharmacy_id = fields.Many2one( + string='Organization', + comodel_name='medical.pharmacy', + required=True, + ondelete='cascade', + ) + carepoint_bind_ids = fields.One2many( + comodel_name='carepoint.carepoint.organization', + inverse_name='odoo_id', + string='Carepoint Bindings', + ) + + +@carepoint +class CarepointOrganizationAdapter(CarepointCRUDAdapter): + """ Backend Adapter for the Carepoint Organization """ + _model_name = 'carepoint.carepoint.organization' + + +@carepoint +class CarepointOrganizationBatchImporter(DelayedBatchImporter): + """ Import the Carepoint Organizations. + For every organization in the list, a delayed job is created. + """ + _model_name = ['carepoint.carepoint.organization'] + + +@carepoint +class CarepointOrganizationImportMapper(PartnerImportMapper): + _model_name = 'carepoint.carepoint.organization' + + direct = [ + (trim('name'), 'name'), + (trim('url'), 'website'), + (trim('email'), 'email'), + (trim('phone'), 'phone'), + (trim('fed_tax_id'), 'vat'), + ('add_date', 'created_at'), + ('chg_date', 'updated_at'), + ] + + @mapping + def carepoint_id(self, record): + return {'carepoint_id': record['org_id']} + + @mapping + @only_create + def odoo_id(self, record): + """ Will bind the organization on a existing organization + with the same name & dob """ + name = self._get_name(record) + organization_id = self.env['carepoint.organization'].search( + [('name', 'ilike', name)], + limit=1, + ) + if organization_id: + return {'odoo_id': organization_id.id} + + +@carepoint +class CarepointOrganizationImporter(CarepointImporter): + _model_name = ['carepoint.carepoint.organization'] + _base_mapper = CarepointOrganizationImportMapper + + def _after_import(self, partner_binding): + """ Import the addresses """ + book = self.unit_for(CarepointAddressOrganizationUnit, + model='carepoint.carepoint.address.organization') + book._import_addresses(self.carepoint_id, partner_binding) + + +@carepoint +class CarepointOrganizationExportMapper(ExportMapper): + _model_name = 'carepoint.carepoint.organization' + + direct = [ + ('name', 'name'), + ('email', 'email'), + ('website', 'url'), + ('phone', 'phone'), + ('vat', 'fed_tax_id_num'), + ] + + @mapping + def org_id(self, record): + return {'org_id': record.carepoint_id} + + +@carepoint +class CarepointOrganizationExporter(CarepointExporter): + _model_name = ['carepoint.carepoint.organization'] + _base_mapper = CarepointOrganizationExportMapper diff --git a/connector_carepoint/models/medical_pharmacy.py b/connector_carepoint/models/carepoint_store.py similarity index 64% rename from connector_carepoint/models/medical_pharmacy.py rename to connector_carepoint/models/carepoint_store.py index 28a9aeb..63f5909 100644 --- a/connector_carepoint/models/medical_pharmacy.py +++ b/connector_carepoint/models/carepoint_store.py @@ -9,7 +9,7 @@ ) from ..unit.backend_adapter import CarepointCRUDAdapter from ..backend import carepoint -from ..unit.mapper import PartnerImportMapper +from ..unit.mapper import PartnerImportMapper, trim from ..unit.import_synchronizer import (DelayedBatchImporter, CarepointImporter, ) @@ -20,16 +20,16 @@ _logger = logging.getLogger(__name__) -class CarepointMedicalPharmacy(models.Model): +class CarepointCarepointStore(models.Model): """ Binding Model for the Carepoint Store """ - _name = 'carepoint.medical.pharmacy' + _name = 'carepoint.carepoint.store' _inherit = 'carepoint.binding' - _inherits = {'medical.pharmacy': 'odoo_id'} + _inherits = {'carepoint.store': 'odoo_id'} _description = 'Carepoint Pharmacy (Store)' _cp_lib = 'store' # Name of model in Carepoint lib (snake_case) odoo_id = fields.Many2one( - comodel_name='medical.pharmacy', + comodel_name='carepoint.store', string='Company', required=True, ondelete='cascade' @@ -40,42 +40,49 @@ class CarepointMedicalPharmacy(models.Model): ) -class MedicalPharmacy(models.Model): +class CarepointStore(models.Model): """ Adds the ``one2many`` relation to the Carepoint bindings (``carepoint_bind_ids``) """ - _inherit = 'medical.pharmacy' + _name = 'carepoint.store' + _inherits = {'medical.pharmacy': 'pharmacy_id'} + pharmacy_id = fields.Many2one( + string='Pharmacy', + comodel_name='medical.pharmacy', + required=True, + ondelete='cascade', + ) carepoint_bind_ids = fields.One2many( - comodel_name='carepoint.medical.pharmacy', + comodel_name='carepoint.carepoint.store', inverse_name='odoo_id', string='Carepoint Bindings', ) @carepoint -class MedicalPharmacyAdapter(CarepointCRUDAdapter): +class CarepointStoreAdapter(CarepointCRUDAdapter): """ Backend Adapter for the Carepoint Store """ - _model_name = 'carepoint.medical.pharmacy' + _model_name = 'carepoint.carepoint.store' @carepoint -class MedicalPharmacyBatchImporter(DelayedBatchImporter): +class CarepointStoreBatchImporter(DelayedBatchImporter): """ Import the Carepoint Stores. For every company in the list, a delayed job is created. """ - _model_name = ['carepoint.medical.pharmacy'] + _model_name = ['carepoint.carepoint.store'] @carepoint -class MedicalPharmacyImportMapper(PartnerImportMapper): - _model_name = 'carepoint.medical.pharmacy' +class CarepointStoreImportMapper(PartnerImportMapper): + _model_name = 'carepoint.carepoint.store' direct = [ - ('name', 'name'), - ('fed_tax_id', 'vat'), - ('url', 'website'), - ('email', 'email'), + (trim('name'), 'name'), + (trim('fed_tax_id'), 'vat'), + (trim('url'), 'website'), + (trim('email'), 'email'), ('nabp', 'nabp_num'), ('medcaid_no', 'medicaid_num'), ('NPI', 'npi_num'), @@ -86,12 +93,16 @@ class MedicalPharmacyImportMapper(PartnerImportMapper): @mapping @only_create def odoo_id(self, record): - """ Will bind the company on an existing company + """ Will bind the company or pharmacy on an existing pharmacy with the same name """ - company_id = self.env['medical.pharmacy'].search( - [('name', 'ilike', record.get('name', ''))], - limit=1, - ) + domain = [('name', 'ilike', record.get('name', ''))] + company_id = self.env['carepoint.store'].search(domain, limit=1) + if not company_id: + pharm = self.env['medical.pharmacy'].search(domain, limit=1) + if pharm: + company_id = self.env['carepoint.store'].create({ + 'pharmacy_id': pharm.id, + }) if company_id: return {'odoo_id': company_id.id} @@ -111,9 +122,9 @@ def carepoint_id(self, record): @carepoint -class MedicalPharmacyImporter(CarepointImporter): - _model_name = ['carepoint.medical.pharmacy'] - _base_mapper = MedicalPharmacyImportMapper +class CarepointStoreImporter(CarepointImporter): + _model_name = ['carepoint.carepoint.store'] + _base_mapper = CarepointStoreImportMapper def _after_import(self, binding): self._import_dependency(binding.carepoint_id, @@ -125,7 +136,7 @@ def _after_import(self, binding): }) def _create(self, data): - binding = super(MedicalPharmacyImporter, self)._create(data) + binding = super(CarepointStoreImporter, self)._create(data) add_checkpoint( self.session, binding._name, binding.id, binding.backend_id.id ) diff --git a/connector_carepoint/models/medical_prescription_order.py b/connector_carepoint/models/medical_prescription_order.py index 0af9f3b..bb375ad 100644 --- a/connector_carepoint/models/medical_prescription_order.py +++ b/connector_carepoint/models/medical_prescription_order.py @@ -82,7 +82,7 @@ def physician_id(self, record): @mapping def partner_id(self, record): - binder = self.binder_for('carepoint.medical.pharmacy') + binder = self.binder_for('carepoint.carepoint.store') pharmacy_id = binder.to_odoo(record['store_id']) return {'partner_id': pharmacy_id} diff --git a/connector_carepoint/models/sale_order.py b/connector_carepoint/models/sale_order.py index 993d287..410b6f6 100644 --- a/connector_carepoint/models/sale_order.py +++ b/connector_carepoint/models/sale_order.py @@ -106,7 +106,7 @@ def partner_data(self, record): @mapping def pharmacy_id(self, record): - binder = self.binder_for('carepoint.medical.pharmacy') + binder = self.binder_for('carepoint.carepoint.store') store_id = binder.to_odoo(record['store_id']) return {'pharmacy_id': store_id} diff --git a/connector_carepoint/models/stock_warehouse.py b/connector_carepoint/models/stock_warehouse.py index cba8132..9796223 100644 --- a/connector_carepoint/models/stock_warehouse.py +++ b/connector_carepoint/models/stock_warehouse.py @@ -80,7 +80,7 @@ def is_pharmacy(self, record): @mapping @only_create def partner_id(self, record): - binder = self.binder_for('carepoint.medical.pharmacy') + binder = self.binder_for('carepoint.carepoint.store') pharmacy_id = binder.to_odoo(record['store_id'], browse=True) return { 'partner_id': pharmacy_id.partner_id.id, diff --git a/connector_carepoint/security/ir.model.access.csv b/connector_carepoint/security/ir.model.access.csv index 9d78a53..e7a43db 100644 --- a/connector_carepoint/security/ir.model.access.csv +++ b/connector_carepoint/security/ir.model.access.csv @@ -2,8 +2,10 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_carepoint_address_medical_user,access_carepoint_address_medical_user,connector_carepoint.model_carepoint_address,medical.group_medical_user,1,0,0,0 access_carepoint_address_physician_medical_user,access_carepoint_address_physician_medical_user,connector_carepoint.model_carepoint_address_physician,medical.group_medical_user,1,0,0,0 access_carepoint_address_patient_medical_user,access_carepoint_address_patient_medical_user,connector_carepoint.model_carepoint_address_patient,medical.group_medical_user,1,0,0,0 -access_carepoint_address_pharmacy_medical_user,access_carepoint_address_pharmacy_medical_user,connector_carepoint.model_carepoint_address_pharmacy,medical.group_medical_user,1,0,0,0 +access_carepoint_address_store_medical_user,access_carepoint_address_store_medical_user,connector_carepoint.model_carepoint_address_store,medical.group_medical_user,1,0,0,0 access_carepoint_account_medical_user,access_carepoint_account_medical_user,connector_carepoint.model_carepoint_account,medical.group_medical_user,1,0,0,0 access_carepoint_state_medical_user,access_carepoint_state_medical_user,connector_carepoint.model_carepoint_state,medical.group_medical_user,1,0,0,0 access_carepoint_vendor_medical_user,access_carepoint_vendor_medical_user,connector_carepoint.model_carepoint_vendor,medical.group_medical_user,1,0,0,0 access_carepoint_item_medical_user,access_carepoint_item_medical_user,connector_carepoint.model_carepoint_item,medical.group_medical_user,1,0,0,0 +access_carepoint_organization_medical_user,access_carepoint_organization_medical_user,connector_carepoint.model_carepoint_organization,medical.group_medical_user,1,0,0,0 +access_carepoint_store_medical_user,access_carepoint_store_medical_user,connector_carepoint.model_carepoint_store,medical.group_medical_user,1,0,0,0 diff --git a/connector_carepoint/static/description/icon.png b/connector_carepoint/static/description/icon.png index 1374c76c0c7f941cacd9f6ee52984da15d3c7a2e..d1b678ab5f7ac1d79038c4ea094c0064d2464479 100644 GIT binary patch delta 11 ScmbQModuleIcon_FullApp2 \ No newline at end of file +ModuleIcon_FullApp2 diff --git a/connector_carepoint/tests/models/__init__.py b/connector_carepoint/tests/models/__init__.py index 993554f..cb8ec4c 100644 --- a/connector_carepoint/tests/models/__init__.py +++ b/connector_carepoint/tests/models/__init__.py @@ -2,7 +2,7 @@ # Copyright 2015-TODAY LasLabs Inc. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import test_medical_pharmacy +from . import test_carepoint_store from . import test_procurement_order from . import test_fdb_unit from . import test_fdb_ndc @@ -17,4 +17,5 @@ from . import test_address_abstract from . import test_address from . import test_address_patient -from . import test_address_pharmacy +from . import test_address_store +from . import test_address_organization diff --git a/connector_carepoint/tests/models/test_address_organization.py b/connector_carepoint/tests/models/test_address_organization.py new file mode 100644 index 0000000..a07b304 --- /dev/null +++ b/connector_carepoint/tests/models/test_address_organization.py @@ -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 address_organization + +from ...unit.backend_adapter import CarepointCRUDAdapter + +from ..common import SetUpCarepointBase + + +_file = 'openerp.addons.connector_carepoint.models.address_organization' + + +class EndTestException(Exception): + pass + + +class AddressOrganizationTestBase(SetUpCarepointBase): + + def setUp(self): + super(AddressOrganizationTestBase, self).setUp() + self.model = 'carepoint.address.organization' + self.mock_env = self.get_carepoint_helper( + self.model + ) + self.record = { + 'org_id': 1, + 'addr_id': 2, + } + + +class TestAddressOrganizationImportMapper(AddressOrganizationTestBase): + + def setUp(self): + super(TestAddressOrganizationImportMapper, self).setUp() + self.Unit = \ + address_organization.CarepointAddressOrganizationImportMapper + self.unit = self.Unit(self.mock_env) + + def test_partner_id_get_binder(self): + """ It should get binder for organization """ + with mock.patch.object(self.unit, 'binder_for'): + self.unit.binder_for.side_effect = EndTestException + with self.assertRaises(EndTestException): + self.unit.partner_id(self.record) + self.unit.binder_for.assert_called_once_with( + 'carepoint.medical.organization' + ) + + def test_partner_id_to_odoo(self): + """ It should get Odoo record for organization """ + with mock.patch.object(self.unit, 'binder_for'): + self.unit.binder_for().to_odoo.side_effect = EndTestException + with self.assertRaises(EndTestException): + self.unit.partner_id(self.record) + self.unit.binder_for().to_odoo.assert_called_once_with( + self.record['org_id'], browse=True, + ) + + def test_carepoint_id(self): + """ It should return correct attribute """ + res = self.unit.carepoint_id(self.record) + expect = { + 'carepoint_id': '%d,%d' % ( + self.record['org_id'], + self.record['addr_id'], + ), + } + self.assertDictEqual(expect, res) + + +class TestAddressOrganizationImporter(AddressOrganizationTestBase): + + def setUp(self): + super(TestAddressOrganizationImporter, self).setUp() + self.Unit = address_organization.CarepointAddressOrganizationImporter + self.unit = self.Unit(self.mock_env) + self.unit.carepoint_record = self.record + + @mock.patch('%s.CarepointAddressAbstractImporter' % _file, + spec=address_organization.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_organization.CarepointAddressAbstractImporter, + ) + def test_import_dependencies_super(self, _super): + """ It should import all dependencies """ + with mock.patch.object(self.unit, '_import_dependency') as mk: + self.unit._import_dependencies() + mk.assert_has_calls([ + mock.call( + self.record['org_id'], + 'carepoint.medical.organization', + ), + ]) + + +class TestCarepointAddressOrganizationUnit(AddressOrganizationTestBase): + + def setUp(self): + super(TestCarepointAddressOrganizationUnit, self).setUp() + self.Unit = address_organization.CarepointAddressOrganizationUnit + self.unit = self.Unit(self.mock_env) + + def test_import_addresses_unit(self): + """ It should get units for adapter and importer """ + with mock.patch.object(self.unit, 'unit_for') as mk: + mk.side_effect = [None, EndTestException] + with self.assertRaises(EndTestException): + self.unit._import_addresses(None, None) + mk.assert_has_calls([ + mock.call(CarepointCRUDAdapter), + mock.call( + address_organization.CarepointAddressOrganizationImporter, + ), + ]) + + def test_import_addresses_search(self): + """ It should search adapter for filters """ + organization = mock.MagicMock() + with mock.patch.object(self.unit, 'unit_for') as mk: + self.unit._import_addresses(organization, None) + mk().search.assert_called_once_with( + org_id=organization, + ) + + def test_import_addresses_import(self): + """ It should run importer on search results """ + expect = mock.MagicMock() + with mock.patch.object(self.unit, 'unit_for') as mk: + mk().search.return_value = [expect] + self.unit._import_addresses(1, None) + mk().run.assert_called_once_with(expect) diff --git a/connector_carepoint/tests/models/test_address_pharmacy.py b/connector_carepoint/tests/models/test_address_store.py similarity index 72% rename from connector_carepoint/tests/models/test_address_pharmacy.py rename to connector_carepoint/tests/models/test_address_store.py index a3f152a..5c75b6b 100644 --- a/connector_carepoint/tests/models/test_address_pharmacy.py +++ b/connector_carepoint/tests/models/test_address_store.py @@ -4,25 +4,25 @@ import mock -from openerp.addons.connector_carepoint.models import address_pharmacy +from openerp.addons.connector_carepoint.models import address_store from ...unit.backend_adapter import CarepointCRUDAdapter from ..common import SetUpCarepointBase -_file = 'openerp.addons.connector_carepoint.models.address_pharmacy' +_file = 'openerp.addons.connector_carepoint.models.address_store' class EndTestException(Exception): pass -class AddressPharmacyTestBase(SetUpCarepointBase): +class AddressStoreTestBase(SetUpCarepointBase): def setUp(self): - super(AddressPharmacyTestBase, self).setUp() - self.model = 'carepoint.address.pharmacy' + super(AddressStoreTestBase, self).setUp() + self.model = 'carepoint.address.store' self.mock_env = self.get_carepoint_helper( self.model ) @@ -32,25 +32,25 @@ def setUp(self): } -class TestAddressPharmacyImportMapper(AddressPharmacyTestBase): +class TestAddressStoreImportMapper(AddressStoreTestBase): def setUp(self): - super(TestAddressPharmacyImportMapper, self).setUp() - self.Unit = address_pharmacy.CarepointAddressPharmacyImportMapper + super(TestAddressStoreImportMapper, self).setUp() + self.Unit = address_store.CarepointAddressStoreImportMapper self.unit = self.Unit(self.mock_env) def test_partner_id_get_binder(self): - """ It should get binder for pharmacy """ + """ It should get binder for store """ with mock.patch.object(self.unit, 'binder_for'): self.unit.binder_for.side_effect = EndTestException with self.assertRaises(EndTestException): self.unit.partner_id(self.record) self.unit.binder_for.assert_called_once_with( - 'carepoint.medical.pharmacy' + 'carepoint.carepoint.store' ) def test_partner_id_to_odoo(self): - """ It should get Odoo record for pharmacy """ + """ It should get Odoo record for store """ with mock.patch.object(self.unit, 'binder_for'): self.unit.binder_for().to_odoo.side_effect = EndTestException with self.assertRaises(EndTestException): @@ -71,16 +71,16 @@ def test_carepoint_id(self): self.assertDictEqual(expect, res) -class TestAddressPharmacyImporter(AddressPharmacyTestBase): +class TestAddressStoreImporter(AddressStoreTestBase): def setUp(self): - super(TestAddressPharmacyImporter, self).setUp() - self.Unit = address_pharmacy.CarepointAddressPharmacyImporter + super(TestAddressStoreImporter, self).setUp() + self.Unit = address_store.CarepointAddressStoreImporter self.unit = self.Unit(self.mock_env) self.unit.carepoint_record = self.record @mock.patch('%s.CarepointAddressAbstractImporter' % _file, - spec=address_pharmacy.CarepointAddressAbstractImporter, + spec=address_store.CarepointAddressAbstractImporter, ) def test_import_dependencies_super(self, _super): """ It should call the super """ @@ -89,7 +89,7 @@ def test_import_dependencies_super(self, _super): self.unit._import_dependencies() @mock.patch('%s.CarepointAddressAbstractImporter' % _file, - spec=address_pharmacy.CarepointAddressAbstractImporter, + spec=address_store.CarepointAddressAbstractImporter, ) def test_import_dependencies_super(self, _super): """ It should import all dependencies """ @@ -98,16 +98,16 @@ def test_import_dependencies_super(self, _super): mk.assert_has_calls([ mock.call( self.record['store_id'], - 'carepoint.medical.pharmacy', + 'carepoint.carepoint.store', ), ]) -class TestCarepointAddressPharmacyUnit(AddressPharmacyTestBase): +class TestCarepointAddressStoreUnit(AddressStoreTestBase): def setUp(self): - super(TestCarepointAddressPharmacyUnit, self).setUp() - self.Unit = address_pharmacy.CarepointAddressPharmacyUnit + super(TestCarepointAddressStoreUnit, self).setUp() + self.Unit = address_store.CarepointAddressStoreUnit self.unit = self.Unit(self.mock_env) def test_import_addresses_unit(self): @@ -119,17 +119,17 @@ def test_import_addresses_unit(self): mk.assert_has_calls([ mock.call(CarepointCRUDAdapter), mock.call( - address_pharmacy.CarepointAddressPharmacyImporter, + address_store.CarepointAddressStoreImporter, ), ]) def test_import_addresses_search(self): """ It should search adapter for filters """ - pharmacy = mock.MagicMock() + store = mock.MagicMock() with mock.patch.object(self.unit, 'unit_for') as mk: - self.unit._import_addresses(pharmacy, None) + self.unit._import_addresses(store, None) mk().search.assert_called_once_with( - store_id=pharmacy, + store_id=store, ) def test_import_addresses_import(self): diff --git a/connector_carepoint/tests/models/test_carepoint_item.py b/connector_carepoint/tests/models/test_carepoint_item.py index 6019fcf..5dd67a1 100644 --- a/connector_carepoint/tests/models/test_carepoint_item.py +++ b/connector_carepoint/tests/models/test_carepoint_item.py @@ -44,7 +44,7 @@ def test_store_id_get_binder(self): with self.assertRaises(EndTestException): self.unit.store_id(self.record) self.unit.binder_for.assert_called_once_with( - 'carepoint.medical.pharmacy' + 'carepoint.carepoint.store' ) def test_store_id_to_odoo(self): diff --git a/connector_carepoint/tests/models/test_carepoint_organization.py b/connector_carepoint/tests/models/test_carepoint_organization.py new file mode 100644 index 0000000..6ea7695 --- /dev/null +++ b/connector_carepoint/tests/models/test_carepoint_organization.py @@ -0,0 +1,98 @@ +# -*- 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 carepoint_organization + +from ..common import SetUpCarepointBase + +from ...models.carepoint_organization import CarepointAddressOrganizationUnit + + +class EndTestException(Exception): + pass + + +class CarepointOrganizationTestBase(SetUpCarepointBase): + + def setUp(self): + super(CarepointOrganizationTestBase, self).setUp() + self.model = 'carepoint.carepoint.organization' + self.mock_env = self.get_carepoint_helper( + self.model + ) + self.record = { + 'name': 'Test Pharmacy', + 'org_id': 123, + } + + +class TestCarepointOrganizationImportMapper(CarepointOrganizationTestBase): + + def setUp(self): + super(TestCarepointOrganizationImportMapper, self).setUp() + self.Unit = carepoint_organization.CarepointOrganizationImportMapper + self.unit = self.Unit(self.mock_env) + + def test_odoo_id_organization(self): + """ It should return odoo_id of pharmacies with same name """ + expect = self.env['carepoint.organization'].create( + self.record + ) + res = self.unit.odoo_id(self.record) + expect = {'odoo_id': expect.id} + self.assertDictEqual(expect, res) + + def test_carepoint_id(self): + """ It should return correct attribute """ + res = self.unit.carepoint_id(self.record) + expect = {'carepoint_id': self.record['org_id']} + self.assertDictEqual(expect, res) + + +class TestCarepointOrganizationImporter(CarepointOrganizationTestBase): + + def setUp(self): + super(TestCarepointOrganizationImporter, self).setUp() + self.Unit = carepoint_organization.CarepointOrganizationImporter + self.unit = self.Unit(self.mock_env) + self.unit.carepoint_id = 9876 + self.unit.carepoint_record = self.record + + def test_after_import_unit(self): + """ It should get unit for importer """ + with mock.patch.object(self.unit, 'unit_for') as mk: + self.unit._after_import(None) + mk.assert_called_once_with( + CarepointAddressOrganizationUnit, + model='carepoint.carepoint.address.organization', + ) + + def test_after_import_import_addresses(self): + """ It should call import_addresses on unit w/ proper args """ + expect = 'partner' + with mock.patch.object(self.unit, 'unit_for') as mk: + self.unit._after_import(expect) + mk()._import_addresses.assert_called_once_with( + self.unit.carepoint_id, + expect, + ) + + +class TestCarepointOrganizationExportMapper(CarepointOrganizationTestBase): + + def setUp(self): + super(TestCarepointOrganizationExportMapper, self).setUp() + self.Unit = carepoint_organization.CarepointOrganizationExportMapper + self.unit = self.Unit(self.mock_env) + self.record = mock.MagicMock() + + def test_addr_id(self): + """ It should return proper vals dict """ + res = self.unit.addr_id(self.record) + self.assertDictEqual( + {'org_id': self.record.carepoint_id}, + res, + ) diff --git a/connector_carepoint/tests/models/test_medical_pharmacy.py b/connector_carepoint/tests/models/test_carepoint_store.py similarity index 81% rename from connector_carepoint/tests/models/test_medical_pharmacy.py rename to connector_carepoint/tests/models/test_carepoint_store.py index 2811d1d..a5678db 100644 --- a/connector_carepoint/tests/models/test_medical_pharmacy.py +++ b/connector_carepoint/tests/models/test_carepoint_store.py @@ -4,7 +4,7 @@ import mock -from openerp.addons.connector_carepoint.models import medical_pharmacy +from openerp.addons.connector_carepoint.models import carepoint_store from ..common import SetUpCarepointBase @@ -13,11 +13,11 @@ class EndTestException(Exception): pass -class MedicalPharmacyTestBase(SetUpCarepointBase): +class CarepointStoreTestBase(SetUpCarepointBase): def setUp(self): - super(MedicalPharmacyTestBase, self).setUp() - self.model = 'carepoint.medical.pharmacy' + super(CarepointStoreTestBase, self).setUp() + self.model = 'carepoint.carepoint.store' self.mock_env = self.get_carepoint_helper( self.model ) @@ -27,16 +27,25 @@ def setUp(self): } -class TestMedicalPharmacyImportMapper(MedicalPharmacyTestBase): +class TestCarepointStoreImportMapper(CarepointStoreTestBase): def setUp(self): - super(TestMedicalPharmacyImportMapper, self).setUp() - self.Unit = medical_pharmacy.MedicalPharmacyImportMapper + super(TestCarepointStoreImportMapper, self).setUp() + self.Unit = carepoint_store.CarepointStoreImportMapper self.unit = self.Unit(self.mock_env) - def test_odoo_id(self): + def test_odoo_id_store(self): """ It should return odoo_id of pharmacies with same name """ - expect = self.env[self.model.replace('carepoint.', '')].create( + expect = self.env['carepoint.store'].create( + self.record + ) + res = self.unit.odoo_id(self.record) + expect = {'odoo_id': expect.id} + self.assertDictEqual(expect, res) + + def test_odoo_id_pharmacy(self): + """ It should return new carepoint.store for pharmacy w/ same name """ + expect = self.env['medical.pharmacy'].create( self.record ) res = self.unit.odoo_id(self.record) @@ -88,11 +97,11 @@ def test_carepoint_id(self): self.assertDictEqual(expect, res) -class TestMedicalPharmacyImporter(MedicalPharmacyTestBase): +class TestCarepointStoreImporter(CarepointStoreTestBase): def setUp(self): - super(TestMedicalPharmacyImporter, self).setUp() - self.Unit = medical_pharmacy.MedicalPharmacyImporter + super(TestCarepointStoreImporter, self).setUp() + self.Unit = carepoint_store.CarepointStoreImporter self.unit = self.Unit(self.mock_env) self.unit.carepoint_record = self.record diff --git a/connector_carepoint/tests/models/test_sale_order.py b/connector_carepoint/tests/models/test_sale_order.py index 01507ed..ba26eb9 100644 --- a/connector_carepoint/tests/models/test_sale_order.py +++ b/connector_carepoint/tests/models/test_sale_order.py @@ -87,7 +87,7 @@ def test_pharmacy_id_get_binder(self): with self.assertRaises(EndTestException): self.unit.pharmacy_id(self.record) self.unit.binder_for.assert_called_once_with( - 'carepoint.medical.pharmacy' + 'carepoint.carepoint.store' ) def test_pharmacy_id_to_odoo(self): diff --git a/connector_carepoint/tests/models/test_stock_warehouse.py b/connector_carepoint/tests/models/test_stock_warehouse.py index c67ddf1..d4374e1 100644 --- a/connector_carepoint/tests/models/test_stock_warehouse.py +++ b/connector_carepoint/tests/models/test_stock_warehouse.py @@ -56,7 +56,7 @@ def test_partner_id_get_binder(self): with self.assertRaises(EndTestException): self.unit.partner_id(self.record) self.unit.binder_for.assert_called_once_with( - 'carepoint.medical.pharmacy' + 'carepoint.carepoint.store' ) def test_partner_id_to_odoo(self): diff --git a/connector_carepoint/tests/test_backend_adapter.py b/connector_carepoint/tests/test_backend_adapter.py index e74deb4..5833438 100644 --- a/connector_carepoint/tests/test_backend_adapter.py +++ b/connector_carepoint/tests/test_backend_adapter.py @@ -17,7 +17,7 @@ def setUp(self): backend_adapter.carepoints = {} self.Model = backend_adapter.CarepointCRUDAdapter - def _init_model(self, model='carepoint.medical.pharmacy'): + def _init_model(self, model='carepoint.carepoint.store'): self.model = self.env[model] self.api_camel = self.__to_camel_case(self.model._cp_lib) return self.Model(self.get_carepoint_helper(model)) diff --git a/connector_carepoint/tests/test_base_exporter.py b/connector_carepoint/tests/test_base_exporter.py index 9ed6a07..535b40c 100644 --- a/connector_carepoint/tests/test_base_exporter.py +++ b/connector_carepoint/tests/test_base_exporter.py @@ -24,7 +24,7 @@ class TestBaseExporter(SetUpCarepointBase): def setUp(self): super(TestBaseExporter, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.carepoint_id = 'carepoint_id' self.binding_id = 1234 self.Exporter = export_synchronizer.CarepointBaseExporter diff --git a/connector_carepoint/tests/test_batch_importer.py b/connector_carepoint/tests/test_batch_importer.py index 60fb3e8..896ba6b 100644 --- a/connector_carepoint/tests/test_batch_importer.py +++ b/connector_carepoint/tests/test_batch_importer.py @@ -20,7 +20,7 @@ class TestBatchImporter(SetUpCarepointBase): def setUp(self): super(TestBatchImporter, self).setUp() self.Importer = import_synchronizer.BatchImporter - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.mock_env = self.get_carepoint_helper( self.model ) diff --git a/connector_carepoint/tests/test_binder.py b/connector_carepoint/tests/test_binder.py index 99de95d..a51cf11 100644 --- a/connector_carepoint/tests/test_binder.py +++ b/connector_carepoint/tests/test_binder.py @@ -16,7 +16,7 @@ class TestBinder(SetUpCarepointBase): def setUp(self): super(TestBinder, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.carepoint_id = 1234567 self.Binder = binder.CarepointModelBinder diff --git a/connector_carepoint/tests/test_carepoint_backend.py b/connector_carepoint/tests/test_carepoint_backend.py index ae22490..79d29a1 100644 --- a/connector_carepoint/tests/test_carepoint_backend.py +++ b/connector_carepoint/tests/test_carepoint_backend.py @@ -45,7 +45,7 @@ def test_synchronize_metadata_imports_pharmacy(self, session, batch): """ It should run import_batch for pharmacy on backend """ self.backend.synchronize_metadata() batch.assert_called_once_with( - session(), 'carepoint.medical.pharmacy', self.backend.id, + session(), 'carepoint.carepoint.store', self.backend.id, ) @mock.patch('%s.import_batch' % model) @@ -54,7 +54,7 @@ def test_import_all_checks_stucture(self, session, batch): """ It should check internal structure on all backends """ self.backend._import_all('model') batch.assert_called_once_with( - session(), 'carepoint.medical.pharmacy', self.backend.id, + session(), 'carepoint.carepoint.store', self.backend.id, ) @mock.patch('%s.import_batch' % model) @@ -73,7 +73,7 @@ def test_import_from_date_checks_stucture(self, session, batch): """ It should check internal structure on all backends """ self.backend._import_from_date('model', 'import_patients_from_date') batch.assert_called_once_with( - session(), 'carepoint.medical.pharmacy', self.backend.id, + session(), 'carepoint.carepoint.store', self.backend.id, ) @mock.patch('%s.datetime' % model) diff --git a/connector_carepoint/tests/test_carepoint_deleter.py b/connector_carepoint/tests/test_carepoint_deleter.py index c050579..01a3631 100644 --- a/connector_carepoint/tests/test_carepoint_deleter.py +++ b/connector_carepoint/tests/test_carepoint_deleter.py @@ -18,7 +18,7 @@ class TestCarepointDeleter(SetUpCarepointBase): def setUp(self): super(TestCarepointDeleter, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.carepoint_id = 'carepoint_id' self.binding_id = 1234 self.Exporter = delete_synchronizer.CarepointDeleter diff --git a/connector_carepoint/tests/test_carepoint_exporter.py b/connector_carepoint/tests/test_carepoint_exporter.py index 4210f74..e1a5a6b 100644 --- a/connector_carepoint/tests/test_carepoint_exporter.py +++ b/connector_carepoint/tests/test_carepoint_exporter.py @@ -56,7 +56,7 @@ class TestCarepointExporter(SetUpCarepointBase): def setUp(self): super(TestCarepointExporter, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.carepoint_id = 'carepoint_id' self.binding_id = 1234 self.Exporter = export_synchronizer.CarepointExporter diff --git a/connector_carepoint/tests/test_carepoint_import_mapper.py b/connector_carepoint/tests/test_carepoint_import_mapper.py index 9f0e8ed..28f1a97 100644 --- a/connector_carepoint/tests/test_carepoint_import_mapper.py +++ b/connector_carepoint/tests/test_carepoint_import_mapper.py @@ -12,7 +12,7 @@ class TestCarepointImporterMapper(SetUpCarepointBase): def setUp(self): super(TestCarepointImporterMapper, self).setUp() self.Importer = mapper.CarepointImportMapper - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.mock_env = self.get_carepoint_helper( self.model ) diff --git a/connector_carepoint/tests/test_carepoint_importer.py b/connector_carepoint/tests/test_carepoint_importer.py index 429d296..ccedda8 100644 --- a/connector_carepoint/tests/test_carepoint_importer.py +++ b/connector_carepoint/tests/test_carepoint_importer.py @@ -47,7 +47,7 @@ class TestCarepointImporter(SetUpCarepointBase): def setUp(self): super(TestCarepointImporter, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.carepoint_id = 'carepoint_id' self.carepoint_record = { 'chg_date': fields.Datetime.from_string('2016-05-10 00:00:00'), diff --git a/connector_carepoint/tests/test_connector.py b/connector_carepoint/tests/test_connector.py index 3418f59..69e4bbb 100644 --- a/connector_carepoint/tests/test_connector.py +++ b/connector_carepoint/tests/test_connector.py @@ -20,7 +20,7 @@ class TestConnector(SetUpCarepointBase): def setUp(self): super(TestConnector, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.carepoint_id = 123456789 self.binding_id = self._new_record() self.session = mock.MagicMock() diff --git a/connector_carepoint/tests/test_consumer.py b/connector_carepoint/tests/test_consumer.py index 17f0bc4..25808f9 100644 --- a/connector_carepoint/tests/test_consumer.py +++ b/connector_carepoint/tests/test_consumer.py @@ -16,7 +16,7 @@ class TestConsumer(SetUpCarepointBase): def setUp(self): super(TestConsumer, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.binding_id = self._new_record() def _new_record(self): @@ -52,7 +52,7 @@ def test_delay_export_all_bindings_context_no_export(self): def test_delay_export_all_bindings(self): """ It should call export_record.delay w/ proper args """ fields = {'test': 123, 'test2': 456} - send = [self.session, 'medical.pharmacy', self.binding_id.odoo_id.id] + send = [self.session, 'carepoint.store', self.binding_id.odoo_id.id] expect = [self.session, self.model, self.binding_id.id] with mock.patch('%s.export_record' % mk_file) as mk: consumer.delay_export_all_bindings(*send, vals=fields) diff --git a/connector_carepoint/tests/test_delayed_batch_importer.py b/connector_carepoint/tests/test_delayed_batch_importer.py index c406b3f..a0803b2 100644 --- a/connector_carepoint/tests/test_delayed_batch_importer.py +++ b/connector_carepoint/tests/test_delayed_batch_importer.py @@ -16,7 +16,7 @@ class TestDelayedBatchImporter(SetUpCarepointBase): def setUp(self): super(TestDelayedBatchImporter, self).setUp() self.Importer = import_synchronizer.DelayedBatchImporter - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.mock_env = self.get_carepoint_helper( self.model ) diff --git a/connector_carepoint/tests/test_direct_batch_importer.py b/connector_carepoint/tests/test_direct_batch_importer.py index 3b27443..bd11c98 100644 --- a/connector_carepoint/tests/test_direct_batch_importer.py +++ b/connector_carepoint/tests/test_direct_batch_importer.py @@ -16,7 +16,7 @@ class TestDirectBatchImporter(SetUpCarepointBase): def setUp(self): super(TestDirectBatchImporter, self).setUp() self.Importer = import_synchronizer.DirectBatchImporter - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.mock_env = self.get_carepoint_helper( self.model ) diff --git a/connector_carepoint/tests/test_related_action.py b/connector_carepoint/tests/test_related_action.py index 0c0b883..2544e1d 100644 --- a/connector_carepoint/tests/test_related_action.py +++ b/connector_carepoint/tests/test_related_action.py @@ -29,7 +29,7 @@ class TestRelatedAction(SetUpCarepointBase): def setUp(self): super(TestRelatedAction, self).setUp() - self.model = 'carepoint.medical.pharmacy' + self.model = 'carepoint.carepoint.store' self.binding_id = self._new_record() self.job = mock.MagicMock() self.job.args = [self.model, self.binding_id.id] diff --git a/connector_carepoint/unit/binder.py b/connector_carepoint/unit/binder.py index e7b2013..dde0a5b 100644 --- a/connector_carepoint/unit/binder.py +++ b/connector_carepoint/unit/binder.py @@ -22,7 +22,8 @@ class CarepointModelBinder(CarepointBinder): fields belonging to the Carepoint instance. """ _model_name = [ - 'carepoint.medical.pharmacy', + 'carepoint.carepoint.store', + 'carepoint.carepoint.organization', 'carepoint.carepoint.item', 'carepoint.medical.physician', 'carepoint.medical.patient', @@ -31,7 +32,8 @@ class CarepointModelBinder(CarepointBinder): 'carepoint.carepoint.address', 'carepoint.carepoint.address.patient', 'carepoint.carepoint.address.physician', - 'carepoint.carepoint.address.pharmacy', + 'carepoint.carepoint.address.organization', + 'carepoint.carepoint.address.store' 'carepoint.carepoint.account', 'carepoint.carepoint.vendor', 'carepoint.account.invoice.line',