mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[WIP] Added Room Type and Rooms
Master Node keeps minimal information of Hotel rooms for managing reservation through the reservation wizard.
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
'views/hotel_node.xml',
|
'views/hotel_node.xml',
|
||||||
'views/hotel_node_user.xml',
|
'views/hotel_node_user.xml',
|
||||||
'views/hotel_node_group.xml',
|
'views/hotel_node_group.xml',
|
||||||
|
'views/hotel_node_room_type.xml',
|
||||||
'security/hotel_node_security.xml',
|
'security/hotel_node_security.xml',
|
||||||
'security/ir.model.access.csv'
|
'security/ir.model.access.csv'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -3,3 +3,5 @@
|
|||||||
from . import hotel_node
|
from . import hotel_node
|
||||||
from . import hotel_node_user
|
from . import hotel_node_user
|
||||||
from . import hotel_node_group
|
from . import hotel_node_group
|
||||||
|
from . import hotel_node_room
|
||||||
|
from . import hotel_node_room_type
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ class HotelNode(models.Model):
|
|||||||
group_ids = fields.Many2many('hotel.node.group', 'hotel_node_group_rel', 'node_id', 'group_id',
|
group_ids = fields.Many2many('hotel.node.group', 'hotel_node_group_rel', 'node_id', 'group_id',
|
||||||
string='Access Groups')
|
string='Access Groups')
|
||||||
|
|
||||||
|
room_type_ids = fields.One2many('hotel.node.room.type', 'node_id',
|
||||||
|
'Rooms Type in this hotel')
|
||||||
|
|
||||||
@api.constrains('group_ids')
|
@api.constrains('group_ids')
|
||||||
def _check_group_version(self):
|
def _check_group_version(self):
|
||||||
"""
|
"""
|
||||||
@@ -77,15 +80,23 @@ class HotelNode(models.Model):
|
|||||||
|
|
||||||
vals.update({'odoo_version': noderpc.version})
|
vals.update({'odoo_version': noderpc.version})
|
||||||
|
|
||||||
|
# Read remote Groups
|
||||||
remote_domain = [('model', '=', 'res.groups')]
|
remote_domain = [('model', '=', 'res.groups')]
|
||||||
remote_fields = ['complete_name', 'display_name']
|
remote_fields = ['complete_name', 'display_name']
|
||||||
remote_groups = noderpc.env['ir.model.data'].search_read(remote_domain, remote_fields)
|
remote_groups = noderpc.env['ir.model.data'].search_read(remote_domain, remote_fields)
|
||||||
|
|
||||||
|
# Read remote Room Type
|
||||||
|
remote_fields = ['name', 'active', 'sequence']
|
||||||
|
remote_room_types = noderpc.env['hotel.room.type'].search_read([], remote_fields)
|
||||||
|
|
||||||
|
wdb.set_trace()
|
||||||
|
|
||||||
noderpc.logout()
|
noderpc.logout()
|
||||||
|
|
||||||
except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err:
|
except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err:
|
||||||
raise ValidationError(err)
|
raise ValidationError(err)
|
||||||
else:
|
else:
|
||||||
|
# Process Groups
|
||||||
master_groups = self.env["hotel.node.group"].search_read(
|
master_groups = self.env["hotel.node.group"].search_read(
|
||||||
[('odoo_version', '=', vals['odoo_version'])], ['xml_id'])
|
[('odoo_version', '=', vals['odoo_version'])], ['xml_id'])
|
||||||
|
|
||||||
@@ -105,6 +116,17 @@ class HotelNode(models.Model):
|
|||||||
}))
|
}))
|
||||||
vals.update({'group_ids': group_ids})
|
vals.update({'group_ids': group_ids})
|
||||||
|
|
||||||
|
# Process Room Type
|
||||||
|
room_type_ids = []
|
||||||
|
for room_type in remote_room_types:
|
||||||
|
room_type_ids.append((0, 0, {
|
||||||
|
'name': room_type['name'],
|
||||||
|
'active': room_type['active'],
|
||||||
|
'sequence': room_type['sequence'],
|
||||||
|
'remote_room_type_id': room_type['id'],
|
||||||
|
}))
|
||||||
|
vals.update({'room_type_ids': room_type_ids})
|
||||||
|
|
||||||
node_id = super().create(vals)
|
node_id = super().create(vals)
|
||||||
|
|
||||||
return node_id
|
return node_id
|
||||||
|
|||||||
26
hotel_node_master/models/hotel_node_room.py
Normal file
26
hotel_node_master/models/hotel_node_room.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Copyright 2018 Pablo Q. Barriuso
|
||||||
|
# Copyright 2018 Alexandre Díaz
|
||||||
|
# Copyright 2018 Dario Lodeiros
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from odoo import models, fields, api, _
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class HotelNodeRoom(models.Model):
|
||||||
|
_name = "hotel.node.room"
|
||||||
|
_description = "Rooms"
|
||||||
|
|
||||||
|
active = fields.Boolean(default=True)
|
||||||
|
sequence = fields.Integer(default=0)
|
||||||
|
|
||||||
|
name = fields.Char(required=True, translate=True)
|
||||||
|
|
||||||
|
remote_room_id = fields.Integer(require=True, invisible=True, copy=False,
|
||||||
|
help="ID of the target record in the remote database")
|
||||||
|
|
||||||
|
room_type_id = fields.Many2one('hotel.node.room.type', 'Hotel Room Type')
|
||||||
|
|
||||||
|
node_id = fields.Many2one('project.project', 'Hotel', required=True)
|
||||||
26
hotel_node_master/models/hotel_node_room_type.py
Normal file
26
hotel_node_master/models/hotel_node_room_type.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Copyright 2018 Pablo Q. Barriuso
|
||||||
|
# Copyright 2018 Alexandre Díaz
|
||||||
|
# Copyright 2018 Dario Lodeiros
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from odoo import models, fields, api, _
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class HotelNodeRoomType(models.Model):
|
||||||
|
_name = "hotel.node.room.type"
|
||||||
|
_description = "Room Type"
|
||||||
|
|
||||||
|
active = fields.Boolean(default=True)
|
||||||
|
sequence = fields.Integer(default=0)
|
||||||
|
|
||||||
|
name = fields.Char(required=True, translate=True)
|
||||||
|
|
||||||
|
remote_room_type_id = fields.Integer(require=True, invisible=True, copy=False,
|
||||||
|
help="ID of the target record in the remote database")
|
||||||
|
|
||||||
|
room_ids = fields.One2many('hotel.node.room', 'room_type_id', 'Rooms')
|
||||||
|
|
||||||
|
node_id = fields.Many2one('project.project', 'Hotel', required=True)
|
||||||
@@ -75,8 +75,7 @@ class HotelNodeUser(models.Model):
|
|||||||
if self.node_id:
|
if self.node_id:
|
||||||
# TODO clean group_ids
|
# TODO clean group_ids
|
||||||
# self.group_ids = []
|
# self.group_ids = []
|
||||||
node = self.env["project.project"].search([('id', '=', self.node_id.id)])
|
return {'domain': {'group_ids': [('odoo_version', '=', self.node_id.odoo_version)]}}
|
||||||
return {'domain': {'group_ids': [('odoo_version', '=', node.odoo_version)]}}
|
|
||||||
|
|
||||||
return {'domain': {'group_ids': []}}
|
return {'domain': {'group_ids': []}}
|
||||||
|
|
||||||
@@ -87,7 +86,6 @@ class HotelNodeUser(models.Model):
|
|||||||
:return: new hotel user record created.
|
:return: new hotel user record created.
|
||||||
:raise: ValidationError
|
:raise: ValidationError
|
||||||
"""
|
"""
|
||||||
wdb.set_trace()
|
|
||||||
node = self.env["project.project"].browse(vals['node_id'])
|
node = self.env["project.project"].browse(vals['node_id'])
|
||||||
|
|
||||||
if 'group_ids' in vals:
|
if 'group_ids' in vals:
|
||||||
@@ -109,10 +107,11 @@ class HotelNodeUser(models.Model):
|
|||||||
'login': vals['login'],
|
'login': vals['login'],
|
||||||
}
|
}
|
||||||
|
|
||||||
groups = self.env["hotel.node.group"].browse(vals['group_ids'][0][2])
|
if 'group_ids' in vals:
|
||||||
# TODO Improve one rpc call per remote group for better performance
|
groups = self.env["hotel.node.group"].browse(vals['group_ids'][0][2])
|
||||||
remote_groups = [noderpc.env.ref(r.xml_id).id for r in groups]
|
# TODO Improve one rpc call per remote group for better performance
|
||||||
remote_vals.update({'groups_id': [[6, False, remote_groups]]})
|
remote_groups = [noderpc.env.ref(r.xml_id).id for r in groups]
|
||||||
|
remote_vals.update({'groups_id': [[6, False, remote_groups]]})
|
||||||
|
|
||||||
# create user and delegate in remote node the default values for the user
|
# create user and delegate in remote node the default values for the user
|
||||||
remote_user_id = noderpc.env['res.users'].create(remote_vals)
|
remote_user_id = noderpc.env['res.users'].create(remote_vals)
|
||||||
|
|||||||
@@ -48,12 +48,18 @@
|
|||||||
<page name="groups" string="Groups" attrs="{'invisible':[('id','=',False)]}">
|
<page name="groups" string="Groups" attrs="{'invisible':[('id','=',False)]}">
|
||||||
<group>
|
<group>
|
||||||
<field name="odoo_version" readonly="1"/>
|
<field name="odoo_version" readonly="1"/>
|
||||||
|
<!-- TODO Make group_ids readonly in hotel node form -->
|
||||||
<field name="group_ids" domain="[('odoo_version','=',odoo_version)]"/>
|
<field name="group_ids" domain="[('odoo_version','=',odoo_version)]"/>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
<page name="users" string="Users" attrs="{'invisible':[('id','=',False)]}">
|
<page name="users" string="Users" attrs="{'invisible':[('id','=',False)]}">
|
||||||
<group>
|
<group>
|
||||||
<field name="user_ids" context="{'default_node_id': id}" />
|
<field name="user_ids" context="{'default_node_id': active_id}" />
|
||||||
|
</group>
|
||||||
|
</page>
|
||||||
|
<page name="room_type" string="Room Type" attrs="{'invisible':[('id','=',False)]}">
|
||||||
|
<group>
|
||||||
|
<field name="room_type_ids" context="{'default_node_id': active_id}" />
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
<page name="settings" string="Settings">
|
<page name="settings" string="Settings">
|
||||||
@@ -104,6 +110,12 @@
|
|||||||
res_model="project.project"
|
res_model="project.project"
|
||||||
view_mode="tree,form"
|
view_mode="tree,form"
|
||||||
/>
|
/>
|
||||||
|
<!-- Action to open Hotel Room Types List -->
|
||||||
|
<act_window id="hotel_node_room_type_action"
|
||||||
|
name="List of Room Types in Hotels"
|
||||||
|
res_model="hotel.node.room.type"
|
||||||
|
view_mode="tree,form"
|
||||||
|
/>
|
||||||
<!-- Action to open Hotel Users List -->
|
<!-- Action to open Hotel Users List -->
|
||||||
<act_window id="hotel_node_user_action"
|
<act_window id="hotel_node_user_action"
|
||||||
name="List of Users in Hotels"
|
name="List of Users in Hotels"
|
||||||
@@ -134,6 +146,13 @@
|
|||||||
parent="dashboard_menu"
|
parent="dashboard_menu"
|
||||||
sequence="1"
|
sequence="1"
|
||||||
/>
|
/>
|
||||||
|
<!-- Menu item to open Hotel Nodes List -->
|
||||||
|
<menuitem id="hotel_node_room_type_menu"
|
||||||
|
name="Room Types"
|
||||||
|
action="hotel_node_room_type_action"
|
||||||
|
parent="hotel_node_menu"
|
||||||
|
sequence="1"
|
||||||
|
/>
|
||||||
<!-- Menu item to open Hotel Users List -->
|
<!-- Menu item to open Hotel Users List -->
|
||||||
<menuitem id="hotel_node_user_menu"
|
<menuitem id="hotel_node_user_menu"
|
||||||
name="Users"
|
name="Users"
|
||||||
|
|||||||
57
hotel_node_master/views/hotel_node_room_type.xml
Normal file
57
hotel_node_master/views/hotel_node_room_type.xml
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="hotel_node_room_type_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">hotel.node.room.type.view.form</field>
|
||||||
|
<field name="model">hotel.node.room.type</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Hotel Room Type">
|
||||||
|
<sheet>
|
||||||
|
<div class="oe_button_box" name="button_box">
|
||||||
|
<button name="toggle_active" type="object"
|
||||||
|
class="oe_stat_button" icon="fa-archive">
|
||||||
|
<field name="active" widget="boolean_button"
|
||||||
|
options='{"terminology": "archive"}'/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="oe_title">
|
||||||
|
<h1>
|
||||||
|
<field name="node_id" placeholder="Hotel" required="1"
|
||||||
|
attrs="{'readonly': [('node_id', '!=', False)]}"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<group name="room_type" attrs="{'invisible':[('node_id','=',False)]}">
|
||||||
|
<group>
|
||||||
|
<field name="name" placeholder="Room Type Name" required="1"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<div name="options_active">
|
||||||
|
<label for="remote_room_type_id" class="oe_inline" string="Remote Room Type :"/>
|
||||||
|
<field name="remote_room_type_id" readonly="1" attrs="{'invisible': [('id', '=', False)]}" />
|
||||||
|
</div>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<notebook>
|
||||||
|
<page name="Rooms" string="Rooms" attrs="{'invisible':[('id','=',False)]}">
|
||||||
|
<group>
|
||||||
|
<field name="room_ids" widget="many2many" domain="[('room_type_id','=',active_id)]"
|
||||||
|
context="{'default_node_id': node_id, 'default_room_type_id': active_id}"/>
|
||||||
|
</group>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="hotel_node_room_type_view_tree" model="ir.ui.view">
|
||||||
|
<field name="name">hotel.node.room.type.tree</field>
|
||||||
|
<field name="model">hotel.node.room.type</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree>
|
||||||
|
<field name="sequence" widget="handle"/>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="node_id"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -14,23 +14,25 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<label for="partner_id" string="Central user" class="oe_edit_only"/>
|
|
||||||
<h1>
|
<h1>
|
||||||
<field name="partner_id" required="1"/>
|
<field name="node_id" placeholder="Hotel" required="1"
|
||||||
|
attrs="{'readonly': [('node_id', '!=', False)]}"/>
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
<group attrs="{'invisible': [('node_id', '=', False)]}">
|
||||||
|
<group name="nodes">
|
||||||
|
<field name="partner_id" placeholder="Name" required="1"/>
|
||||||
|
<field name="remote_user_id" readonly="1" attrs="{'invisible': [('id', '=', False)]}" />
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
<group attrs="{'invisible': [('partner_id', '=', False)]}">
|
<group attrs="{'invisible': [('partner_id', '=', False)]}">
|
||||||
<group name="login">
|
<group name="login">
|
||||||
<field name="login"/>
|
<field name="login"/>
|
||||||
<field name="password" password="True"/>
|
<field name="password" password="True"/>
|
||||||
</group>
|
</group>
|
||||||
<group name="nodes">
|
|
||||||
<field name="node_id"/>
|
|
||||||
<field name="remote_user_id" readonly="1" attrs="{'invisible': [('id', '=', False)]}" />
|
|
||||||
</group>
|
|
||||||
</group>
|
</group>
|
||||||
<group name="groups" attrs="{'invisible': [('node_id', '=', False)]}">
|
<group name="groups" attrs="{'invisible': [('node_id', '=', False)]}" collapse="2">
|
||||||
<field name="group_ids"/>
|
<field name="group_ids"/>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
</form>
|
</form>
|
||||||
@@ -46,7 +48,6 @@
|
|||||||
<field name="partner_id"/>
|
<field name="partner_id"/>
|
||||||
<field name="login"/>
|
<field name="login"/>
|
||||||
<field name="node_id"/>
|
<field name="node_id"/>
|
||||||
<field name="remote_user_id"/>
|
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
Reference in New Issue
Block a user