Skip to content

Commit

Permalink
[ADD] connector_carepoint: Add phone syncing
Browse files Browse the repository at this point in the history
* Add patient phone two way sync
* Add physician phone two way sync
* Add organization phone two way sync
* Add store phone two way sync
* Add cascade deletion for address
* Fix missing comma in binder
* Add phonenumbers to requirements
  • Loading branch information
lasley committed Sep 29, 2016
1 parent 90ce4ba commit f9d230d
Show file tree
Hide file tree
Showing 25 changed files with 2,196 additions and 11 deletions.
8 changes: 8 additions & 0 deletions connector_carepoint/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@
from . import address_organization
from . import address_physician

# Phone / Relations
from . import phone
from . import phone_abstract
from . import phone_patient
from . import phone_store
from . import phone_organization
from . import phone_physician

# CarePoint Mappings/Binds
from . import carepoint_account
from . import carepoint_store
Expand Down
1 change: 1 addition & 0 deletions connector_carepoint/models/address.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class CarepointAddress(models.Model):
string='Partner',
comodel_name='res.partner',
readonly=True,
ondelete='cascade',
)

carepoint_bind_ids = fields.One2many(
Expand Down
11 changes: 10 additions & 1 deletion connector_carepoint/models/carepoint_organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from ..unit.export_synchronizer import CarepointExporter

from .address_organization import CarepointAddressOrganizationUnit
from .phone_organization import CarepointPhoneOrganizationUnit

_logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -116,6 +117,9 @@ def _after_import(self, partner_binding):
book = self.unit_for(CarepointAddressOrganizationUnit,
model='carepoint.carepoint.address.organization')
book._import_addresses(self.carepoint_id, partner_binding)
phone = self.unit_for(CarepointPhoneOrganizationUnit,
model='carepoint.carepoint.phone.organization')
phone._import_phones(self.carepoint_id, partner_binding)


@carepoint
Expand All @@ -141,7 +145,12 @@ class CarepointOrganizationExporter(CarepointExporter):
_base_mapper = CarepointOrganizationExportMapper

def _after_export(self):
self.env['carepoint.organization']._get_by_partner(
self.env['carepoint.address.organization']._get_by_partner(
self.binding_record.commercial_partner_id,
edit=True,
recurse=True,
)
self.env['carepoint.phone.organization']._get_by_partner(
self.binding_record.commercial_partner_id,
edit=True,
recurse=True,
Expand Down
9 changes: 9 additions & 0 deletions connector_carepoint/models/medical_patient.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from ..unit.export_synchronizer import CarepointExporter

from .address_patient import CarepointAddressPatientUnit
from .phone_patient import CarepointPhonePatientUnit
from .carepoint_account import CarepointAccountUnit

_logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -119,6 +120,9 @@ def _after_import(self, partner_binding):
book = self.unit_for(CarepointAddressPatientUnit,
model='carepoint.carepoint.address.patient')
book._import_addresses(self.carepoint_id, partner_binding)
phone = self.unit_for(CarepointPhonePatientUnit,
model='carepoint.carepoint.phone.patient')
phone._import_phones(self.carepoint_id, partner_binding)
account = self.unit_for(CarepointAccountUnit,
model='carepoint.carepoint.account')
account._import_accounts(self.carepoint_id)
Expand Down Expand Up @@ -170,6 +174,11 @@ def _after_export(self):
edit=True,
recurse=True,
)
self.env['carepoint.phone.patient']._get_by_partner(
self.binding_record.commercial_partner_id,
edit=True,
recurse=True,
)
self.env['carepoint.account']._get_by_patient(
self.binding_record.odoo_id,
create=True,
Expand Down
17 changes: 17 additions & 0 deletions connector_carepoint/models/medical_physician.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
)
from ..unit.export_synchronizer import CarepointExporter

from .address_physician import CarepointAddressPhysicianUnit
from .phone_physician import CarepointPhonePhysicianUnit


_logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -103,6 +106,15 @@ class MedicalPhysicianImporter(CarepointImporter):
_model_name = ['carepoint.medical.physician']
_base_mapper = MedicalPhysicianImportMapper

def _after_import(self, partner_binding):
""" Import the addresses and accounts """
book = self.unit_for(CarepointAddressPhysicianUnit,
model='carepoint.carepoint.address.physician')
book._import_addresses(self.carepoint_id, partner_binding)
phone = self.unit_for(CarepointPhonePhysicianUnit,
model='carepoint.carepoint.phone.physician')
phone._import_phones(self.carepoint_id, partner_binding)


@carepoint
class MedicalPhysicianExportMapper(PersonExportMapper):
Expand All @@ -129,3 +141,8 @@ def _after_export(self):
edit=True,
recurse=True,
)
self.env['carepoint.phone.physician']._get_by_partner(
self.binding_record.commercial_partner_id,
edit=True,
recurse=True,
)
183 changes: 183 additions & 0 deletions connector_carepoint/models/phone.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
# -*- 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, api

from openerp.addons.connector.connector import ConnectorUnit
from openerp.addons.connector.unit.mapper import (mapping,
changed_by,
ExportMapper,
)
from ..unit.backend_adapter import CarepointCRUDAdapter
from ..unit.mapper import CarepointImportMapper
from ..backend import carepoint
from ..unit.import_synchronizer import (DelayedBatchImporter,
CarepointImporter,
)
from ..unit.export_synchronizer import CarepointExporter


_logger = logging.getLogger(__name__)


try:
import phonenumbers
except ImportError:
_logger.warning('Cannot import phonenumbers')


class CarepointCarepointPhone(models.Model):
""" Binding Model for the Carepoint Phone """
_name = 'carepoint.carepoint.phone'
_inherit = 'carepoint.binding'
_inherits = {'carepoint.phone': 'odoo_id'}
_description = 'Carepoint Phone'
_cp_lib = 'phone'

odoo_id = fields.Many2one(
comodel_name='carepoint.phone',
string='Company',
required=True,
ondelete='cascade'
)


class CarepointPhone(models.Model):
""" Adds the ``one2many`` relation to the Carepoint bindings
(``carepoint_bind_ids``)
"""
_name = 'carepoint.phone'
_description = 'Carepoint Phone'

PARTNER_ATTRS = [
'phone',
]

phone = fields.Char()
partner_id = fields.Many2one(
string='Partner',
comodel_name='res.partner',
readonly=True,
ondelete='cascade',
)

carepoint_bind_ids = fields.One2many(
comodel_name='carepoint.carepoint.phone',
inverse_name='odoo_id',
string='Carepoint Bindings',
)

@api.multi
@api.depends('partner_id', *PARTNER_ATTRS)
def _sync_partner(self):
for rec_id in self:
if not len(rec_id.partner_id):
continue
rec_id.partner_id.write(
self._get_partner_sync_vals(self)
)

@api.model
def _get_partner_sync_vals(self, partner):
""" It extracts sync values from the partner or partner like record
Params:
parner: Recordset of partner or phone
Returns:
``dict`` of values for create or write
"""
vals = {}
for attr in self.PARTNER_ATTRS:
val = getattr(partner, attr, False)
if getattr(val, 'id', False):
val = val.id
if not val:
val = False
vals[attr] = val
return vals


@carepoint
class CarepointPhoneAdapter(CarepointCRUDAdapter):
""" Backend Adapter for the Carepoint Phone """
_model_name = 'carepoint.carepoint.phone'


@carepoint
class CarepointPhoneUnit(ConnectorUnit):
_model_name = 'carepoint.carepoint.phone'

def _import_by_filter(self, **filters):
adapter = self.unit_for(CarepointCRUDAdapter)
importer = self.unit_for(CarepointPhoneImporter)
rec_ids = adapter.search(**filters)
for rec_id in rec_ids:
importer.run(rec_id)


@carepoint
class CarepointPhoneBatchImporter(DelayedBatchImporter):
""" Import the Carepoint Phones.
For every phone in the list, a delayed job is created.
"""
_model_name = 'carepoint.carepoint.phone'


@carepoint
class CarepointPhoneImportMapper(CarepointImportMapper):
_model_name = 'carepoint.carepoint.phone'

@mapping
def phone(self, record):
phone_no = record['phone_no'].strip()
area_code = record['area_code'].strip()
ext = record['extension'].strip()
phone = '%s-%s' % (phone_no[0:3], phone_no[3:])
if not area_code:
area_code = '000'
phone = '+1 (%s) %s' % (area_code, phone)
if ext:
phone = '%s x%s' % (phone, ext)
return {'phone': phone}

@mapping
def carepoint_id(self, record):
return {'carepoint_id': record['phone_id']}


@carepoint
class CarepointPhoneImporter(CarepointImporter):
_model_name = 'carepoint.carepoint.phone'
_base_mapper = CarepointPhoneImportMapper


@carepoint
class CarepointPhoneExportMapper(ExportMapper):
_model_name = 'carepoint.carepoint.phone'

@mapping
@changed_by('phone')
def phone(self, record):
try:
phone = phonenumbers.parse(record.phone)
except phonenumbers.phonenumberutil.NumberParseException:
return
national_number = str(phone.national_number)
vals = {
'area_code': national_number[0:3],
'phone_no': national_number[3:],
}
if phone.extension:
vals['extension'] = phone.extension
return vals

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


@carepoint
class CarepointPhoneExporter(CarepointExporter):
_model_name = ['carepoint.carepoint.phone']
_base_mapper = CarepointPhoneExportMapper
Loading

0 comments on commit f9d230d

Please sign in to comment.