mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
Merge pull request #103 from hootel/task_51
Task 51 :: Review Calendar Management Wizard
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
# Copyright 2017 Alexandre Díaz
|
# Copyright 2017 Alexandre Díaz
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from openerp import models, fields, api
|
from odoo import models, fields, api
|
||||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
|
||||||
|
|
||||||
|
|
||||||
class MassiveChangesWizard(models.TransientModel):
|
class MassiveChangesWizard(models.TransientModel):
|
||||||
@@ -26,8 +26,7 @@ class MassiveChangesWizard(models.TransientModel):
|
|||||||
('0', 'Global'),
|
('0', 'Global'),
|
||||||
('1', 'Room Type'),
|
('1', 'Room Type'),
|
||||||
], string='Applied On', default='0')
|
], string='Applied On', default='0')
|
||||||
# room_type_ids = fields.Many2many('hotel.virtual.room',
|
|
||||||
# string="Virtual Rooms")
|
|
||||||
room_type_ids = fields.Many2many('hotel.room.type', string="Room Types")
|
room_type_ids = fields.Many2many('hotel.room.type', string="Room Types")
|
||||||
|
|
||||||
# Restriction fields
|
# Restriction fields
|
||||||
@@ -157,11 +156,10 @@ class MassiveChangesWizard(models.TransientModel):
|
|||||||
def _save_restrictions(self, ndate, room_types, record):
|
def _save_restrictions(self, ndate, room_types, record):
|
||||||
hotel_room_type_re_it_obj = self.env['hotel.room.type.restriction.item']
|
hotel_room_type_re_it_obj = self.env['hotel.room.type.restriction.item']
|
||||||
domain = [
|
domain = [
|
||||||
('date_start', '>=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
('date', '>=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
||||||
('date_end', '<=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
('date', '<=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
||||||
('restriction_id', '=', record.restriction_id.id),
|
('restriction_id', '=', record.restriction_id.id),
|
||||||
]
|
]
|
||||||
|
|
||||||
for room_type in room_types:
|
for room_type in room_types:
|
||||||
vals = self._get_restrictions_values(record)
|
vals = self._get_restrictions_values(record)
|
||||||
if not any(vals):
|
if not any(vals):
|
||||||
@@ -173,8 +171,7 @@ class MassiveChangesWizard(models.TransientModel):
|
|||||||
rrest_item_ids.write(vals)
|
rrest_item_ids.write(vals)
|
||||||
else:
|
else:
|
||||||
vals.update({
|
vals.update({
|
||||||
'date_start': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT),
|
'date': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT),
|
||||||
'date_end': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT),
|
|
||||||
'restriction_id': record.restriction_id.id,
|
'restriction_id': record.restriction_id.id,
|
||||||
'room_type_id': room_type.id,
|
'room_type_id': room_type.id,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
<group colspan="8" col="8">
|
<group colspan="8" col="8">
|
||||||
<field name="date_start" required="1" colspan="4"/>
|
<field name="date_start" required="1" colspan="4"/>
|
||||||
<field name="date_end" required="1" colspan="4" />
|
<field name="date_end" required="1" colspan="4" />
|
||||||
<field name="dmo" colspan="1" />
|
<field name="dmo" />
|
||||||
<field name="dtu" colspan="1" />
|
<field name="dtu" />
|
||||||
<field name="dwe" colspan="1" />
|
<field name="dwe" />
|
||||||
<field name="dth" colspan="1" />
|
<field name="dth" />
|
||||||
<field name="dfr" colspan="1" />
|
<field name="dfr" />
|
||||||
<field name="dsa" colspan="1" />
|
<field name="dsa" />
|
||||||
<field name="dsu" colspan="1" />
|
<field name="dsu" />
|
||||||
</group>
|
</group>
|
||||||
<!-- Restricion Fields -->
|
<!-- Restricion Fields -->
|
||||||
<group col="4" colspan="4" attrs="{'invisible':[('section', '!=', 'restrictions')]}">
|
<group col="4" colspan="4" attrs="{'invisible':[('section', '!=', 'restrictions')]}">
|
||||||
|
|||||||
@@ -18,18 +18,22 @@ class HotelRoomTypeAvailability(models.Model):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _default_max_avail(self):
|
def _default_max_avail(self):
|
||||||
room_type_id = self._context.get('room_type_id')
|
room_type_id = self.room_type_id.id or self._context.get('room_type_id')
|
||||||
if room_type_id:
|
channel_room_type = self.env['channel.hotel.room.type'].search([
|
||||||
room_type_id = self.env['hotel.room_type'].browse(room_type_id)
|
('odoo_id', '=', room_type_id)
|
||||||
return room_type_id.default_max_avail if room_type_id else -1
|
]) or None
|
||||||
|
if channel_room_type:
|
||||||
|
return channel_room_type.default_max_avail
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _default_quota(self):
|
def _default_quota(self):
|
||||||
room_type_id = self._context.get('room_type_id')
|
room_type_id = self.room_type_id.id or self._context.get('room_type_id')
|
||||||
if room_type_id:
|
channel_room_type = self.env['channel.hotel.room.type'].search([
|
||||||
room_type_id = self.env['hotel.room_type'].browse(room_type_id)
|
('odoo_id', '=', room_type_id)
|
||||||
return room_type_id.default_quota if room_type_id else -1
|
]) or None
|
||||||
|
if channel_room_type:
|
||||||
|
return channel_room_type.default_quota
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
room_type_id = fields.Many2one('hotel.room.type', 'Room Type',
|
room_type_id = fields.Many2one('hotel.room.type', 'Room Type',
|
||||||
@@ -44,6 +48,7 @@ class HotelRoomTypeAvailability(models.Model):
|
|||||||
|
|
||||||
quota = fields.Integer("Quota", default=_default_quota,
|
quota = fields.Integer("Quota", default=_default_quota,
|
||||||
help="Quota assigned to the channel.")
|
help="Quota assigned to the channel.")
|
||||||
|
# TODO: WHY max_avail IS READONLY ¿?
|
||||||
max_avail = fields.Integer("Max. Availability", default=-1, readonly=True,
|
max_avail = fields.Integer("Max. Availability", default=-1, readonly=True,
|
||||||
help="Maximum simultaneous availability.")
|
help="Maximum simultaneous availability.")
|
||||||
|
|
||||||
@@ -72,8 +77,34 @@ class HotelRoomTypeAvailability(models.Model):
|
|||||||
|
|
||||||
@api.onchange('room_type_id')
|
@api.onchange('room_type_id')
|
||||||
def onchange_room_type_id(self):
|
def onchange_room_type_id(self):
|
||||||
if self.room_type_id:
|
channel_room_type = self.env['channel.hotel.room.type'].search([
|
||||||
self.quota = self.room_type_id.default_quota
|
('odoo_id', '=', self.room_type_id.id)
|
||||||
|
]) or None
|
||||||
|
if channel_room_type:
|
||||||
|
self.quota = channel_room_type.default_quota
|
||||||
|
self.max_avail = channel_room_type.default_max_avail
|
||||||
|
self.no_ota = 0
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def create(self, vals):
|
||||||
|
vals.update(self._prepare_add_missing_fields(vals))
|
||||||
|
return super().create(vals)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _prepare_add_missing_fields(self, values):
|
||||||
|
""" Deduce missing required fields from the onchange """
|
||||||
|
res = {}
|
||||||
|
onchange_fields = ['quota', 'max_avail']
|
||||||
|
if values.get('room_type_id'):
|
||||||
|
record = self.new(values)
|
||||||
|
if 'quota' not in values:
|
||||||
|
record.quota = record._default_quota()
|
||||||
|
if 'max_avail' not in values:
|
||||||
|
record.max_avail = record._default_max_avail()
|
||||||
|
for field in onchange_fields:
|
||||||
|
if field not in values:
|
||||||
|
res[field] = record._fields[field].convert_to_write(record[field], record)
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
class ChannelHotelRoomTypeAvailability(models.Model):
|
class ChannelHotelRoomTypeAvailability(models.Model):
|
||||||
@@ -152,6 +183,8 @@ class ChannelHotelRoomTypeAvailability(models.Model):
|
|||||||
_logger.info(vals_avail)
|
_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 self._context.get('update_no_ota', False):
|
||||||
|
vals_avail.update({'channel_pushed': False})
|
||||||
if vals_avail:
|
if vals_avail:
|
||||||
room_type_avail_id.write(vals_avail)
|
room_type_avail_id.write(vals_avail)
|
||||||
|
|
||||||
@@ -209,11 +242,13 @@ 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):
|
||||||
|
if 'no_ota' in fields_checked:
|
||||||
_logger.info("==[on_record_write] :: hotel.room.type.availability==")
|
self.env.context = dict(self.env.context)
|
||||||
_logger.info(fields)
|
self.env.context.update({'update_no_ota': True})
|
||||||
|
|
||||||
for binding in record.channel_bind_ids:
|
for binding in record.channel_bind_ids:
|
||||||
binding.refresh_availability(
|
binding.refresh_availability(
|
||||||
record.date,
|
record.date,
|
||||||
@@ -261,7 +296,7 @@ class ChannelBindingHotelRoomTypeAvailabilityListener(Component):
|
|||||||
|
|
||||||
@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_write(self, record, fields=None):
|
def on_record_write(self, record, fields=None):
|
||||||
fields_to_check = ('date', 'channel_avail') # no_ota ¿?
|
fields_to_check = ('date', 'channel_avail')
|
||||||
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] :: channel.hotel.room.type.availability==")
|
_logger.info("==[on_record_write] :: channel.hotel.room.type.availability==")
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ class MassiveChangesWizard(models.TransientModel):
|
|||||||
|
|
||||||
# Availability fields
|
# Availability fields
|
||||||
change_quota = fields.Boolean(default=False)
|
change_quota = fields.Boolean(default=False)
|
||||||
quota = fields.Integer('Quota', default=-1)
|
quota = fields.Integer('Quota', default=0)
|
||||||
change_max_avail = fields.Boolean(default=False)
|
change_max_avail = fields.Boolean(default=False)
|
||||||
max_avail = fields.Integer('Max. Avail.', default=-1)
|
max_avail = fields.Integer('Max. Avail.', default=0)
|
||||||
change_no_ota = fields.Boolean(default=False)
|
change_no_ota = fields.Boolean(default=False)
|
||||||
no_ota = fields.Boolean('No OTA', default=False)
|
no_ota = fields.Boolean('No OTA', default=False)
|
||||||
|
|
||||||
|
|||||||
@@ -7,27 +7,21 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//form/group[last()]" position="after">
|
<xpath expr="//form/group[last()]" position="after">
|
||||||
<!-- Availability Fields -->
|
<!-- Availability Fields -->
|
||||||
<group col="3" colspan="3" attrs="{'invisible':[('section', '!=', 'avail')]}">
|
<group col="8" colspan="8" attrs="{'invisible':[('section', '!=', 'avail')]}">
|
||||||
<table class="oe_form_group">
|
<field name="change_max_avail"/>
|
||||||
<thead>
|
<field name="max_avail"
|
||||||
<th width="12%"></th>
|
attrs="{'readonly':[('change_max_avail', '=', False)],
|
||||||
<th></th>
|
'invisible':[('change_max_avail', '=', False)]}"/>
|
||||||
</thead>
|
|
||||||
<tbody>
|
<field name="change_quota"/>
|
||||||
<tr class="oe_form_group_row">
|
<field name="quota"
|
||||||
<td class="oe_form_group_cell oe_form_group_cell_label"><field name="change_max_avail" /> <strong> Max. Avail.</strong></td>
|
attrs="{'readonly':[('change_quota', '=', False)],
|
||||||
<td class="oe_form_group_cell" colspan="3"><field name="max_avail" attrs="{'readonly':[('change_max_avail', '=', False)]}" /></td>
|
'invisible':[('change_quota', '=', False)]}"/>
|
||||||
</tr>
|
|
||||||
<tr class="oe_form_group_row">
|
<field name="change_no_ota"/>
|
||||||
<td class="oe_form_group_cell oe_form_group_cell_label"><field name="change_quota" /> <strong> Quota</strong></td>
|
<field name="no_ota"
|
||||||
<td class="oe_form_group_cell" colspan="3"><field name="quota" attrs="{'readonly':[('change_quota', '=', False)]}" /></td>
|
attrs="{'readonly':[('change_no_ota', '=', False)],
|
||||||
</tr>
|
'invisible':[('change_no_ota', '=', False)]}"/>
|
||||||
<tr class="oe_form_group_row">
|
|
||||||
<td class="oe_form_group_cell oe_form_group_cell_label"><field name="change_no_ota" /> <strong> No OTA</strong></td>
|
|
||||||
<td class="oe_form_group_cell"><field name="no_ota" attrs="{'readonly':[('change_no_ota', '=', False)]}" /></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</group>
|
</group>
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
Reference in New Issue
Block a user