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
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
from datetime import timedelta
|
||||
from openerp import models, fields, api
|
||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
|
||||
from odoo import models, fields, api
|
||||
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
|
||||
|
||||
|
||||
class MassiveChangesWizard(models.TransientModel):
|
||||
@@ -26,8 +26,7 @@ class MassiveChangesWizard(models.TransientModel):
|
||||
('0', 'Global'),
|
||||
('1', 'Room Type'),
|
||||
], 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")
|
||||
|
||||
# Restriction fields
|
||||
@@ -157,11 +156,10 @@ class MassiveChangesWizard(models.TransientModel):
|
||||
def _save_restrictions(self, ndate, room_types, record):
|
||||
hotel_room_type_re_it_obj = self.env['hotel.room.type.restriction.item']
|
||||
domain = [
|
||||
('date_start', '>=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
||||
('date_end', '<=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
||||
('date', '>=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
||||
('date', '<=', ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
||||
('restriction_id', '=', record.restriction_id.id),
|
||||
]
|
||||
|
||||
for room_type in room_types:
|
||||
vals = self._get_restrictions_values(record)
|
||||
if not any(vals):
|
||||
@@ -173,8 +171,7 @@ class MassiveChangesWizard(models.TransientModel):
|
||||
rrest_item_ids.write(vals)
|
||||
else:
|
||||
vals.update({
|
||||
'date_start': 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,
|
||||
'room_type_id': room_type.id,
|
||||
})
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
<group colspan="8" col="8">
|
||||
<field name="date_start" required="1" colspan="4"/>
|
||||
<field name="date_end" required="1" colspan="4" />
|
||||
<field name="dmo" colspan="1" />
|
||||
<field name="dtu" colspan="1" />
|
||||
<field name="dwe" colspan="1" />
|
||||
<field name="dth" colspan="1" />
|
||||
<field name="dfr" colspan="1" />
|
||||
<field name="dsa" colspan="1" />
|
||||
<field name="dsu" colspan="1" />
|
||||
<field name="dmo" />
|
||||
<field name="dtu" />
|
||||
<field name="dwe" />
|
||||
<field name="dth" />
|
||||
<field name="dfr" />
|
||||
<field name="dsa" />
|
||||
<field name="dsu" />
|
||||
</group>
|
||||
<!-- Restricion Fields -->
|
||||
<group col="4" colspan="4" attrs="{'invisible':[('section', '!=', 'restrictions')]}">
|
||||
|
||||
@@ -18,18 +18,22 @@ class HotelRoomTypeAvailability(models.Model):
|
||||
|
||||
@api.model
|
||||
def _default_max_avail(self):
|
||||
room_type_id = self._context.get('room_type_id')
|
||||
if room_type_id:
|
||||
room_type_id = self.env['hotel.room_type'].browse(room_type_id)
|
||||
return room_type_id.default_max_avail if room_type_id else -1
|
||||
room_type_id = self.room_type_id.id or self._context.get('room_type_id')
|
||||
channel_room_type = self.env['channel.hotel.room.type'].search([
|
||||
('odoo_id', '=', room_type_id)
|
||||
]) or None
|
||||
if channel_room_type:
|
||||
return channel_room_type.default_max_avail
|
||||
return -1
|
||||
|
||||
@api.model
|
||||
def _default_quota(self):
|
||||
room_type_id = self._context.get('room_type_id')
|
||||
if room_type_id:
|
||||
room_type_id = self.env['hotel.room_type'].browse(room_type_id)
|
||||
return room_type_id.default_quota if room_type_id else -1
|
||||
room_type_id = self.room_type_id.id or self._context.get('room_type_id')
|
||||
channel_room_type = self.env['channel.hotel.room.type'].search([
|
||||
('odoo_id', '=', room_type_id)
|
||||
]) or None
|
||||
if channel_room_type:
|
||||
return channel_room_type.default_quota
|
||||
return -1
|
||||
|
||||
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,
|
||||
help="Quota assigned to the channel.")
|
||||
# TODO: WHY max_avail IS READONLY ¿?
|
||||
max_avail = fields.Integer("Max. Availability", default=-1, readonly=True,
|
||||
help="Maximum simultaneous availability.")
|
||||
|
||||
@@ -72,8 +77,34 @@ class HotelRoomTypeAvailability(models.Model):
|
||||
|
||||
@api.onchange('room_type_id')
|
||||
def onchange_room_type_id(self):
|
||||
if self.room_type_id:
|
||||
self.quota = self.room_type_id.default_quota
|
||||
channel_room_type = self.env['channel.hotel.room.type'].search([
|
||||
('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):
|
||||
@@ -152,6 +183,8 @@ class ChannelHotelRoomTypeAvailability(models.Model):
|
||||
_logger.info(vals_avail)
|
||||
if room_type_avail_id.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:
|
||||
room_type_avail_id.write(vals_avail)
|
||||
|
||||
@@ -209,11 +242,13 @@ class BindingHotelRoomTypeAvailabilityListener(Component):
|
||||
fields_to_check = ('quota', 'max_avail', 'no_ota')
|
||||
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):
|
||||
|
||||
_logger.info("==[on_record_write] :: hotel.room.type.availability==")
|
||||
_logger.info(fields)
|
||||
|
||||
if 'no_ota' in fields_checked:
|
||||
self.env.context = dict(self.env.context)
|
||||
self.env.context.update({'update_no_ota': True})
|
||||
for binding in record.channel_bind_ids:
|
||||
binding.refresh_availability(
|
||||
record.date,
|
||||
@@ -261,7 +296,7 @@ class ChannelBindingHotelRoomTypeAvailabilityListener(Component):
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
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]
|
||||
|
||||
_logger.info("==[on_record_write] :: channel.hotel.room.type.availability==")
|
||||
|
||||
@@ -13,9 +13,9 @@ class MassiveChangesWizard(models.TransientModel):
|
||||
|
||||
# Availability fields
|
||||
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)
|
||||
max_avail = fields.Integer('Max. Avail.', default=-1)
|
||||
max_avail = fields.Integer('Max. Avail.', default=0)
|
||||
change_no_ota = fields.Boolean(default=False)
|
||||
no_ota = fields.Boolean('No OTA', default=False)
|
||||
|
||||
|
||||
@@ -7,27 +7,21 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//form/group[last()]" position="after">
|
||||
<!-- Availability Fields -->
|
||||
<group col="3" colspan="3" attrs="{'invisible':[('section', '!=', 'avail')]}">
|
||||
<table class="oe_form_group">
|
||||
<thead>
|
||||
<th width="12%"></th>
|
||||
<th></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="oe_form_group_row">
|
||||
<td class="oe_form_group_cell oe_form_group_cell_label"><field name="change_max_avail" /> <strong> Max. Avail.</strong></td>
|
||||
<td class="oe_form_group_cell" colspan="3"><field name="max_avail" attrs="{'readonly':[('change_max_avail', '=', False)]}" /></td>
|
||||
</tr>
|
||||
<tr class="oe_form_group_row">
|
||||
<td class="oe_form_group_cell oe_form_group_cell_label"><field name="change_quota" /> <strong> Quota</strong></td>
|
||||
<td class="oe_form_group_cell" colspan="3"><field name="quota" attrs="{'readonly':[('change_quota', '=', False)]}" /></td>
|
||||
</tr>
|
||||
<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 col="8" colspan="8" attrs="{'invisible':[('section', '!=', 'avail')]}">
|
||||
<field name="change_max_avail"/>
|
||||
<field name="max_avail"
|
||||
attrs="{'readonly':[('change_max_avail', '=', False)],
|
||||
'invisible':[('change_max_avail', '=', False)]}"/>
|
||||
|
||||
<field name="change_quota"/>
|
||||
<field name="quota"
|
||||
attrs="{'readonly':[('change_quota', '=', False)],
|
||||
'invisible':[('change_quota', '=', False)]}"/>
|
||||
|
||||
<field name="change_no_ota"/>
|
||||
<field name="no_ota"
|
||||
attrs="{'readonly':[('change_no_ota', '=', False)],
|
||||
'invisible':[('change_no_ota', '=', False)]}"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
Reference in New Issue
Block a user