[WIP] improve availability performance

This commit is contained in:
Pablo
2019-03-04 23:01:20 +01:00
parent 0374f945fe
commit 80719f3f16
2 changed files with 49 additions and 54 deletions

View File

@@ -171,10 +171,7 @@ class HotelReservation(models.Model):
('odoo_id', '=', vals['room_type_id']) ('odoo_id', '=', vals['room_type_id'])
]).backend_id ]).backend_id
# WARNING: more than one backend_id is currently not expected # WARNING: more than one backend_id is currently not expected
self.env['channel.hotel.room.type.availability'].with_context( self.env['channel.hotel.room.type.availability'].refresh_availability(
# export the availability as it is created
{'connector_no_export': False}
).refresh_availability(
checkin=vals['real_checkin'], checkin=vals['real_checkin'],
checkout=vals['real_checkout'], checkout=vals['real_checkout'],
backend_id=backend_id.id, backend_id=backend_id.id,
@@ -187,7 +184,8 @@ class HotelReservation(models.Model):
def write(self, vals): def write(self, vals):
if self._context.get('connector_no_export', True) and \ if self._context.get('connector_no_export', True) and \
(vals.get('checkin') or vals.get('checkout') or (vals.get('checkin') or vals.get('checkout') or
vals.get('room_id') or vals.get('state')): vals.get('room_id') or vals.get('state') or
vals.get('overbooking')):
old_vals = [] old_vals = []
new_vals = [] new_vals = []
for record in self: for record in self:

View File

@@ -173,22 +173,15 @@ class ChannelHotelRoomTypeAvailability(models.Model):
vals_avail = {} vals_avail = {}
if room_type_avail_id.quota != quota: if room_type_avail_id.quota != quota:
vals_avail.update({'quota': quota}) vals_avail.update({'quota': quota})
_logger.info(vals_avail)
if room_type_avail_id.channel_avail != avail: if room_type_avail_id.channel_avail != avail:
vals_avail.update({'channel_avail': avail}) vals_avail.update({'channel_avail': avail})
if vals_avail: if vals_avail:
room_type_avail_id.write(vals_avail) room_type_avail_id.write(vals_avail)
else: else:
# self.env['hotel.room.type.availability'].create({ self.env['hotel.room.type.availability'].with_context(
# 'room_type_id': room_type_bind.odoo_id.id, {'connector_no_export': True}
# 'date': ndate_str, ).create({
# 'channel_bind_ids': [(0, False, {
# 'channel_avail': avail,
# 'channel_pushed': False,
# 'backend_id': backend_id,
# 'quota': quota,
# })]
# })
self.env['hotel.room.type.availability'].create({
'room_type_id': room_type_bind.odoo_id.id, 'room_type_id': room_type_bind.odoo_id.id,
'date': ndate_str, 'date': ndate_str,
'quota': quota, 'quota': quota,
@@ -198,6 +191,7 @@ class ChannelHotelRoomTypeAvailability(models.Model):
'backend_id': backend_id, 'backend_id': backend_id,
})] })]
}) })
self.push_availability(self.env['channel.backend'].browse(backend_id))
@job(default_channel='root.channel') @job(default_channel='root.channel')
@api.model @api.model
@@ -226,10 +220,11 @@ class BindingHotelRoomTypeAvailabilityListener(Component):
fields_to_check = ('quota', 'max_avail', 'no_ota') fields_to_check = ('quota', 'max_avail', 'no_ota')
fields_checked = [elm for elm in fields_to_check if elm in fields] fields_checked = [elm for elm in fields_to_check if elm in fields]
_logger.info("==[on_record_write] :: hotel.room.type.availability==")
_logger.info(fields)
if any(fields_checked) and any(record.channel_bind_ids): if any(fields_checked) and any(record.channel_bind_ids):
_logger.info("==[on_record_write] :: hotel.room.type.availability==")
_logger.info(fields)
for binding in record.channel_bind_ids: for binding in record.channel_bind_ids:
binding.refresh_availability( binding.refresh_availability(
record.date, record.date,
@@ -238,36 +233,36 @@ class BindingHotelRoomTypeAvailabilityListener(Component):
binding.backend_id.id, binding.backend_id.id,
room_type_id=record.room_type_id.id) room_type_id=record.room_type_id.id)
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record)) # @skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
def on_record_create(self, record, fields=None): # def on_record_create(self, record, fields=None):
if not any(record.channel_bind_ids): # if not any(record.channel_bind_ids):
channel_room_type_avail_obj = self.env[ # channel_room_type_avail_obj = self.env[
'channel.hotel.room.type.availability'] # 'channel.hotel.room.type.availability']
backends = self.env['channel.backend'].search([]) # backends = self.env['channel.backend'].search([])
for backend in backends: # for backend in backends:
# REVIEW :: If you create directly channel_binding, this search # # REVIEW :: If you create directly channel_binding, this search
# return empty # # return empty
avail_bind = channel_room_type_avail_obj.search([ # avail_bind = channel_room_type_avail_obj.search([
('odoo_id', '=', record.id), # ('odoo_id', '=', record.id),
('backend_id', '=', backend.id), # ('backend_id', '=', backend.id),
]) # ])
if not avail_bind: # if not avail_bind:
# REVIEW :: WARNING :: This create triggers on_record_write above # # REVIEW :: WARNING :: This create triggers on_record_write above
avail_bind = channel_room_type_avail_obj.create({ # avail_bind = channel_room_type_avail_obj.create({
'odoo_id': record.id, # 'odoo_id': record.id,
'channel_pushed': False, # 'channel_pushed': False,
'backend_id': backend.id, # 'backend_id': backend.id,
}) # })
_logger.info("==[on_record_create] :: hotel.room.type.availability==") # _logger.info("==[on_record_create] :: hotel.room.type.availability==")
_logger.info(avail_bind) # _logger.info(avail_bind)
else: # else:
avail_bind.refresh_availability( # avail_bind.refresh_availability(
record.date, # record.date,
(datetime.strptime(record.date, DEFAULT_SERVER_DATE_FORMAT).date() + # (datetime.strptime(record.date, DEFAULT_SERVER_DATE_FORMAT).date() +
timedelta(days=1)).strftime(DEFAULT_SERVER_DATE_FORMAT), # timedelta(days=1)).strftime(DEFAULT_SERVER_DATE_FORMAT),
backend.id, # backend.id,
# room_type_id=record.room_type_id.channel_bind_ids.id, # # room_type_id=record.room_type_id.channel_bind_ids.id,
room_type_id=record.room_type_id.id) # room_type_id=record.room_type_id.id)
class ChannelBindingHotelRoomTypeAvailabilityListener(Component): class ChannelBindingHotelRoomTypeAvailabilityListener(Component):
@@ -285,21 +280,23 @@ class ChannelBindingHotelRoomTypeAvailabilityListener(Component):
if any(fields_checked): if any(fields_checked):
# self.env['channel.backend'].cron_push_changes() # self.env['channel.backend'].cron_push_changes()
record.channel_pushed = False record.with_context({'connector_no_export': True}).write({'channel_pushed': False})
record.push_availability(record.backend_id) # record.push_availability(record.backend_id)
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record)) @skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
def on_record_create(self, record, fields=None): def on_record_create(self, record, fields=None):
if any(record.channel_bind_ids): if any(record.channel_bind_ids):
_logger.info("==[on_record_create] :: channel.hotel.room.type.availability==")
_logger.info(fields)
for binding in record.channel_bind_ids: for binding in record.channel_bind_ids:
record.refresh_availability( record.refresh_availability(
record.date, record.date,
record.date, record.date,
binding.backend_id.id, binding.backend_id.id,
room_type_id=record.room_type_id.id) room_type_id=record.room_type_id.id)
_logger.info("==[on_record_create] :: channel.hotel.room.type.availability==") # record.push_availability(record.backend_id)
_logger.info(fields)
record.push_availability(record.backend_id)
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record)) @skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
def on_fix_channel_availability(self, record, fields=None): def on_fix_channel_availability(self, record, fields=None):