mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]pms: Add property team members features
This commit is contained in:
@@ -93,7 +93,6 @@
|
||||
"views/res_partner_id_category.xml",
|
||||
"views/payment_transaction_views.xml",
|
||||
"views/account_move_line_views.xml",
|
||||
"views/pms_team_views.xml",
|
||||
],
|
||||
"demo": [
|
||||
"demo/pms_master_data.xml",
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<field name="code">model.update_daily_priority_reservation()</field>
|
||||
</record>
|
||||
<!-- Scheduler for send confirmed email -->
|
||||
<record model="ir.cron" id="send_confirmation_email_folio">
|
||||
<!-- <record model="ir.cron" id="send_confirmation_email_folio">
|
||||
<field name="name">Send Confirmation Email</field>
|
||||
<field name="interval_number">5</field>
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
@@ -85,7 +85,7 @@
|
||||
<field name="model_id" ref="model_pms_folio" />
|
||||
<field name="nextcall" eval="DateTime.now()" />
|
||||
<field name="code">model.send_cancelation_mail()</field>
|
||||
</record>
|
||||
</record> -->
|
||||
<record model="ir.cron" id="autoinvoicing_folios">
|
||||
<field name="name">Auto Invoicing Folios</field>
|
||||
<field name="interval_number">5</field>
|
||||
|
||||
@@ -47,4 +47,4 @@ from . import res_partner_id_number
|
||||
from . import pms_automated_mails
|
||||
from . import payment_transaction
|
||||
from . import res_partner_id_category
|
||||
from . import pms_team
|
||||
from . import pms_team_member
|
||||
|
||||
@@ -186,7 +186,6 @@ class PmsAvailability(models.Model):
|
||||
room=room.parent_id,
|
||||
checkin=checkin,
|
||||
checkout=checkout,
|
||||
pms_property_id=room.pms_property_id.id,
|
||||
):
|
||||
occupied_room_ids.append(room.id)
|
||||
for room in rooms.filtered("child_ids"):
|
||||
@@ -194,7 +193,6 @@ class PmsAvailability(models.Model):
|
||||
rooms=room.child_ids,
|
||||
checkin=checkin,
|
||||
checkout=checkout,
|
||||
pms_property_id=room.pms_property_id.id,
|
||||
):
|
||||
occupied_room_ids.append(room.id)
|
||||
occupied_room_ids.extend(
|
||||
@@ -212,7 +210,7 @@ class PmsAvailability(models.Model):
|
||||
return occupied_room_ids
|
||||
|
||||
@api.model
|
||||
def get_occupied_parent_rooms(self, room, checkin, checkout, pms_property_id):
|
||||
def get_occupied_parent_rooms(self, room, checkin, checkout):
|
||||
RoomLines = self.env["pms.reservation.line"]
|
||||
if (
|
||||
RoomLines.search_count(
|
||||
@@ -220,7 +218,6 @@ class PmsAvailability(models.Model):
|
||||
("date", ">=", checkin),
|
||||
("date", "<=", checkout - datetime.timedelta(1)),
|
||||
("room_id", "=", room.id),
|
||||
("pms_property_id", "=", pms_property_id),
|
||||
("occupies_availability", "=", True),
|
||||
]
|
||||
)
|
||||
@@ -229,22 +226,23 @@ class PmsAvailability(models.Model):
|
||||
return True
|
||||
if room.parent_id:
|
||||
return self.get_occupied_parent_rooms(
|
||||
room=room.parent_room_id,
|
||||
checkin=checkin,
|
||||
checkout=checkout,
|
||||
room=room.parent_id, checkin=checkin, checkout=checkout
|
||||
)
|
||||
return False
|
||||
|
||||
@api.model
|
||||
def get_occupied_child_rooms(self, rooms, checkin, checkout, pms_property_id):
|
||||
def get_occupied_child_rooms(self, rooms, checkin, checkout):
|
||||
RoomLines = self.env["pms.reservation.line"]
|
||||
mapped_properties = list(set(rooms.mapped("pms_property_id.id")))
|
||||
if len(mapped_properties) > 1:
|
||||
raise ValidationError(_("Rooms shared between different properties"))
|
||||
|
||||
if (
|
||||
RoomLines.search_count(
|
||||
[
|
||||
("date", ">=", checkin),
|
||||
("date", "<=", checkout - datetime.timedelta(1)),
|
||||
("room_id", "in", rooms.ids),
|
||||
("pms_property_id", "=", pms_property_id),
|
||||
("occupies_availability", "=", True),
|
||||
]
|
||||
)
|
||||
|
||||
@@ -153,8 +153,8 @@ class PmsFolio(models.Model):
|
||||
compute="_compute_commission",
|
||||
)
|
||||
user_id = fields.Many2one(
|
||||
string="Salesperson",
|
||||
help="The user who created the folio",
|
||||
string="Reception Manager",
|
||||
help="The reception manager in the folio",
|
||||
readonly=False,
|
||||
index=True,
|
||||
store=True,
|
||||
@@ -163,6 +163,39 @@ class PmsFolio(models.Model):
|
||||
compute="_compute_user_id",
|
||||
tracking=True,
|
||||
)
|
||||
revenue_user_id = fields.Many2one(
|
||||
string="Revenue Manager",
|
||||
help="The revenue manager in the folio",
|
||||
readonly=False,
|
||||
index=True,
|
||||
store=True,
|
||||
comodel_name="res.users",
|
||||
ondelete="restrict",
|
||||
compute="_compute_revenue_user_id",
|
||||
tracking=True,
|
||||
)
|
||||
administrative_user_id = fields.Many2one(
|
||||
string="Administrative Manager",
|
||||
help="The administrative manager in the folio",
|
||||
readonly=False,
|
||||
index=True,
|
||||
store=True,
|
||||
comodel_name="res.users",
|
||||
ondelete="restrict",
|
||||
compute="_compute_administrative_user_id",
|
||||
tracking=True,
|
||||
)
|
||||
manager_user_id = fields.Many2one(
|
||||
string="Main Manager",
|
||||
help="The main manager in the folio",
|
||||
readonly=False,
|
||||
index=True,
|
||||
store=True,
|
||||
comodel_name="res.users",
|
||||
ondelete="restrict",
|
||||
compute="_compute_manager_user_id",
|
||||
tracking=True,
|
||||
)
|
||||
agency_id = fields.Many2one(
|
||||
string="Agency",
|
||||
help="Only allowed if the field of partner is_agency is True",
|
||||
@@ -912,11 +945,54 @@ class PmsFolio(models.Model):
|
||||
elif not folio.partner_id:
|
||||
folio.partner_id = False
|
||||
|
||||
@api.depends("partner_id")
|
||||
@api.depends("pms_property_id")
|
||||
def _compute_user_id(self):
|
||||
active_user_id = self.env.uid
|
||||
for folio in self:
|
||||
if not folio.user_id:
|
||||
folio.user_id = (folio.partner_id.user_id.id or self.env.uid,)
|
||||
property_users = folio.pms_property_id.member_ids.filtered(
|
||||
lambda u: u.pms_role == "reception"
|
||||
).mapped("user_id")
|
||||
if property_users:
|
||||
if active_user_id in property_users.ids:
|
||||
folio.user_id = active_user_id
|
||||
elif property_users:
|
||||
folio.user_id = property_users[0]
|
||||
else:
|
||||
folio.user_id = active_user_id or folio.pms_property_id.user_id
|
||||
|
||||
@api.depends("pms_property_id")
|
||||
def _compute_revenue_user_id(self):
|
||||
for folio in self:
|
||||
revenue_users = folio.pms_property_id.member_ids.filtered(
|
||||
lambda u: u.pms_role == "revenue"
|
||||
).mapped("user_id")
|
||||
if revenue_users:
|
||||
folio.revenue_user_id = revenue_users[0]
|
||||
else:
|
||||
folio.revenue_user_id = False
|
||||
|
||||
@api.depends("pms_property_id")
|
||||
def _compute_administrative_user_id(self):
|
||||
for folio in self:
|
||||
administrative_users = folio.pms_property_id.member_ids.filtered(
|
||||
lambda u: u.pms_role == "administrative"
|
||||
).mapped("user_id")
|
||||
if administrative_users:
|
||||
folio.administrative_user_id = administrative_users[0]
|
||||
else:
|
||||
folio.administrative_user_id = False
|
||||
|
||||
@api.depends("pms_property_id")
|
||||
def _compute_manager_user_id(self):
|
||||
for folio in self:
|
||||
manager_users = folio.pms_property_id.member_ids.filtered(
|
||||
lambda u: u.pms_role == "manager"
|
||||
).mapped("user_id")
|
||||
if manager_users:
|
||||
folio.manager_user_id = manager_users[0]
|
||||
else:
|
||||
folio.manager_user_id = False
|
||||
|
||||
@api.depends(
|
||||
"partner_id",
|
||||
|
||||
@@ -190,6 +190,19 @@ class PmsProperty(models.Model):
|
||||
help="Maximum amount to create the simplified invoice",
|
||||
default=400.0,
|
||||
)
|
||||
user_id = fields.Many2one(
|
||||
string="Team Leader",
|
||||
copy=False,
|
||||
comodel_name="res.users",
|
||||
ondelete="restrict",
|
||||
tracking=True,
|
||||
)
|
||||
member_ids = fields.One2many(
|
||||
string="Team Members",
|
||||
comodel_name="pms.team.member",
|
||||
inverse_name="pms_property_id",
|
||||
copy=False,
|
||||
)
|
||||
|
||||
@api.depends_context(
|
||||
"checkin",
|
||||
|
||||
@@ -191,13 +191,15 @@ class PmsReservation(models.Model):
|
||||
check_pms_properties=True,
|
||||
)
|
||||
user_id = fields.Many2one(
|
||||
string="Salesperson",
|
||||
help="User who manages the reservation",
|
||||
string="Reception Manager",
|
||||
help="The reception manager in the folio",
|
||||
readonly=False,
|
||||
index=True,
|
||||
store=True,
|
||||
related="folio_id.user_id",
|
||||
depends=["folio_id.user_id"],
|
||||
default=lambda self: self.env.user.id,
|
||||
comodel_name="res.users",
|
||||
ondelete="restrict",
|
||||
compute="_compute_user_id",
|
||||
tracking=True,
|
||||
)
|
||||
show_update_pricelist = fields.Boolean(
|
||||
string="Has Pricelist Changed",
|
||||
@@ -988,6 +990,22 @@ class PmsReservation(models.Model):
|
||||
reservation.pms_property_id.default_pricelist_id
|
||||
)
|
||||
|
||||
@api.depends("folio_id", "pms_property_id")
|
||||
def _compute_user_id(self):
|
||||
active_user_id = self.env.uid
|
||||
for res in self:
|
||||
if not res.user_id and not res.folio_id:
|
||||
property_users = res.pms_property_id.member_ids.filtered(
|
||||
lambda u: u.pms_role == "reception"
|
||||
).mapped("user_id")
|
||||
if property_users:
|
||||
if active_user_id in property_users.ids:
|
||||
res.user_id = active_user_id
|
||||
elif property_users:
|
||||
res.user_id = property_users[0]
|
||||
else:
|
||||
res.user_id = active_user_id or res.pms_property_id.user_id
|
||||
|
||||
@api.depends("pricelist_id", "room_type_id")
|
||||
def _compute_show_update_pricelist(self):
|
||||
for reservation in self:
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class PmsTeam(models.Model):
|
||||
_name = "pms.team"
|
||||
_inherit = ["mail.thread"]
|
||||
_description = "PMS Team"
|
||||
_check_pms_properties_auto = True
|
||||
|
||||
name = fields.Char("PMS Team", required=True)
|
||||
sequence = fields.Integer("Sequence", default=10)
|
||||
active = fields.Boolean(default=True)
|
||||
pms_property_id = fields.Many2one("pms.property", string="Property")
|
||||
user_id = fields.Many2one("res.users", string="Team Leader")
|
||||
member_ids = fields.One2many("res.users", "pms_team_id", string="Channel Members")
|
||||
45
pms/models/pms_team_member.py
Normal file
45
pms/models/pms_team_member.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class PmsTeamMember(models.Model):
|
||||
_name = "pms.team.member"
|
||||
_description = "PMS Team Member"
|
||||
|
||||
name = fields.Char(
|
||||
string="Name",
|
||||
store=True,
|
||||
related="user_id.name",
|
||||
)
|
||||
active = fields.Boolean(
|
||||
string="Active",
|
||||
default=True,
|
||||
)
|
||||
sequence = fields.Integer(
|
||||
string="Sequence",
|
||||
default=10,
|
||||
)
|
||||
pms_property_id = fields.Many2one(
|
||||
string="Property",
|
||||
comodel_name="pms.property",
|
||||
store=True,
|
||||
ondelete="restrict",
|
||||
)
|
||||
user_id = fields.Many2one(
|
||||
string="User Member",
|
||||
copy=False,
|
||||
comodel_name="res.users",
|
||||
ondelete="restrict",
|
||||
)
|
||||
pms_role = fields.Selection(
|
||||
string="PMS Role",
|
||||
help="The member role in the organization"
|
||||
"It can be 'Reception', 'Revenue', 'Administrative', or 'Manager'",
|
||||
copy=False,
|
||||
selection=[
|
||||
("reception", "Reception"),
|
||||
("revenue", "Revenue"),
|
||||
("administrative", "Administrative"),
|
||||
("manager", "Operational Manager"),
|
||||
],
|
||||
required=True,
|
||||
)
|
||||
@@ -276,8 +276,6 @@ class ResPartner(models.Model):
|
||||
vat_document_types.append((doc_type.name, doc_type.name))
|
||||
return vat_document_types
|
||||
|
||||
team_id = fields.Many2one("pms.team", "PMS Team")
|
||||
|
||||
@api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.gender")
|
||||
def _compute_gender(self):
|
||||
if hasattr(super(), "_compute_gender"):
|
||||
|
||||
@@ -25,8 +25,6 @@ class ResUsers(models.Model):
|
||||
domain="[('company_id','in',company_ids)]",
|
||||
)
|
||||
|
||||
pms_team_id = fields.Many2one("pms.team", "User's PMS Team")
|
||||
|
||||
@api.model
|
||||
def get_active_property_ids(self):
|
||||
# TODO: Require performance test and security (dont allow any property id)
|
||||
|
||||
@@ -24,6 +24,7 @@ user_access_account_full_reconcile,user_access_account_full_reconcile,account.mo
|
||||
user_access_property,user_access_property,model_pms_property,pms.group_pms_user,1,0,0,0
|
||||
user_access_availability,user_access_availability,model_pms_availability_plan,pms.group_pms_user,1,0,0,0
|
||||
user_access_pms_sale_channel,user_access_pms_sale_channel,model_pms_sale_channel,pms.group_pms_user,1,0,0,0
|
||||
user_access_pms_team_member,user_access_pms_team_member,model_pms_team_member,pms.group_pms_user,1,0,0,0
|
||||
manager_access_pms_ubication,manager_access_pms_ubication,model_pms_ubication,pms.group_pms_manager,1,1,1,1
|
||||
manager_access_pms_amenity,manager_access_pms_amenity,model_pms_amenity,pms.group_pms_manager,1,1,1,1
|
||||
manager_access_pms_amenity_type,manager_access_pms_amenity_type,model_pms_amenity_type,pms.group_pms_manager,1,1,1,1
|
||||
@@ -47,6 +48,7 @@ manager_access_property,manager_access_property,model_pms_property,pms.group_pms
|
||||
manager_access_pms_cancelation_rule,manager_access_pms_cancelation_rule,model_pms_cancelation_rule,pms.group_pms_manager,1,1,1,1
|
||||
manager_access_availability,manager_access_availability,model_pms_availability_plan,pms.group_pms_manager,1,1,1,1
|
||||
manager_access_pms_sale_channel,manager_access_pms_sale_channel,model_pms_sale_channel,pms.group_pms_manager,1,1,1,1
|
||||
manager_access_pms_team_member,manager_access_pms_team_member,model_pms_team_member,pms.group_pms_manager,1,1,1,1
|
||||
user_access_pms_reservation_split_join_swap_wizard,user_access_pms_reservation_split_join_swap_wizard,model_pms_reservation_split_join_swap_wizard,pms.group_pms_user,1,1,1,1
|
||||
user_access_pms_wizard_reservation_lines_split,user_access_pms_wizard_reservation_lines_split,model_pms_wizard_reservation_lines_split,pms.group_pms_user,1,1,1,1
|
||||
user_access_pms_massive_changes_wizard,user_access_pms_massive_changes_wizard,model_pms_massive_changes_wizard,pms.group_pms_user,1,1,1,1
|
||||
@@ -66,4 +68,3 @@ user_access_res_partner_portal,user_access_res_partner_portal,model_res_partner,
|
||||
user_access_pms_precheckin_portal,user_access_pms_precheckin_portal,model_pms_checkin_partner,base.group_portal,1,1,1,1
|
||||
user_access_pms_booking_duplicate,user_access_pms_booking_duplicate,model_pms_booking_duplicate,pms.group_pms_user,1,1,1,1
|
||||
user_access_pms_reservation_duplicate,user_access_pms_reservation_duplicate,model_pms_reservation_duplicate,pms.group_pms_user,1,1,1,1
|
||||
user_access_pms_team,user_access_pms_team,model_pms_team,pms.group_pms_user,1,1,1,1
|
||||
|
||||
|
@@ -586,6 +586,11 @@
|
||||
<page string="Other data">
|
||||
<group>
|
||||
<field name="user_id" />
|
||||
<field name="manager_user_id" />
|
||||
<field name="revenue_user_id" />
|
||||
<field name="administrative_user_id" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="force_nothing_to_invoice" />
|
||||
</group>
|
||||
</page>
|
||||
|
||||
@@ -130,6 +130,10 @@
|
||||
string="Cancellation Email"
|
||||
name="property_canceled_template"
|
||||
/>
|
||||
<field
|
||||
string="Exit Email"
|
||||
name="property_exit_template"
|
||||
/>
|
||||
</group>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
@@ -162,6 +166,75 @@
|
||||
<field name="privacy_policy" />
|
||||
</group>
|
||||
</page>
|
||||
<page name="members" string="Team Members">
|
||||
<label for="user_id" string="Team Leader" />
|
||||
<h3>
|
||||
<field name="user_id" options="{'no_create': True}" />
|
||||
</h3>
|
||||
<field
|
||||
name="member_ids"
|
||||
mode="kanban"
|
||||
context="{'default_pms_property_id': active_id}"
|
||||
>
|
||||
<kanban
|
||||
on_create="quick_create"
|
||||
quick_create_view="pms.pms_team_member_view_form"
|
||||
delete="true"
|
||||
sample="1"
|
||||
>
|
||||
<field name="id" />
|
||||
<field name="name" />
|
||||
<field name="user_id" />
|
||||
<field name="pms_role" />
|
||||
<field name="pms_property_id" invisible="1" />
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div
|
||||
class="oe_kanban_global_click"
|
||||
style="max-width: 200px"
|
||||
>
|
||||
<div class="o_kanban_record_top">
|
||||
<img
|
||||
t-att-src="kanban_image('res.users', 'image_128', record.user_id.raw_value)"
|
||||
class="oe_avatar oe_kanban_avatar_smallbox o_image_40_cover mb0"
|
||||
alt="Avatar"
|
||||
/>
|
||||
<div class="oe_kanban_content">
|
||||
<div>
|
||||
<strong
|
||||
class="o_kanban_record_title"
|
||||
>
|
||||
<field
|
||||
name="pms_role"
|
||||
/>
|
||||
</strong>
|
||||
</div>
|
||||
<div>
|
||||
<field name="name" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_clear" />
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
<form string="Member Team">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<label for="name" />
|
||||
<h1>
|
||||
<field name="name" />
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<field name="user_id" />
|
||||
<field name="pms_role" />
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
|
||||
@@ -68,8 +68,8 @@
|
||||
attrs="{'invisible':['|','|',('to_send_mail', '=', False), ('state', 'not in', 'cancel'),('reservation_type', 'in', 'out')]}"
|
||||
/>
|
||||
<field name="state" widget="statusbar" />
|
||||
<field name="to_send_mail" invisible="0" />
|
||||
<field name="is_modified_reservation" invisible="0" />
|
||||
<field name="to_send_mail" invisible="1" />
|
||||
<field name="is_modified_reservation" invisible="1" />
|
||||
</header>
|
||||
<div
|
||||
class="alert alert-info"
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<record id="pms_team_view_form" model="ir.ui.view">
|
||||
<field name="name">pms.team.form</field>
|
||||
<field name="model">pms.team</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="PMS Team">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box" />
|
||||
<widget
|
||||
name="web_ribbon"
|
||||
title="Archived"
|
||||
bg_color="bg-danger"
|
||||
attrs="{'invisible': [('active', '=', True)]}"
|
||||
/>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only" string="PMS Team" />
|
||||
<h1>
|
||||
<field name="name" placeholder="PMS Team name..." />
|
||||
</h1>
|
||||
<div name="options_active" />
|
||||
</div>
|
||||
<group>
|
||||
<group name="left">
|
||||
<field name="active" />
|
||||
<field name="user_id" domain="[('share', '=', False)]" />
|
||||
<field
|
||||
name="pms_property_id"
|
||||
options="{'no_create': True}"
|
||||
/>
|
||||
</group>
|
||||
<group name="right">
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page name="members" string="Team Members">
|
||||
<field
|
||||
name="member_ids"
|
||||
widget="many2many"
|
||||
options="{'not_delete': True}"
|
||||
>
|
||||
<kanban
|
||||
quick_create="false"
|
||||
create="true"
|
||||
delete="true"
|
||||
>
|
||||
<field name="id" />
|
||||
<field name="name" />
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div
|
||||
class="oe_kanban_global_click"
|
||||
style="max-width: 200px"
|
||||
>
|
||||
<div class="o_kanban_record_top">
|
||||
<img
|
||||
t-att-src="kanban_image('res.users', 'image_128', record.id.raw_value)"
|
||||
class="oe_avatar oe_kanban_avatar_smallbox o_image_40_cover mb0"
|
||||
alt="Avatar"
|
||||
/>
|
||||
<div
|
||||
class="o_kanban_record_headings ml8"
|
||||
>
|
||||
<strong
|
||||
class="o_kanban_record_title"
|
||||
><field name="name" /></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field
|
||||
name="message_follower_ids"
|
||||
help="Follow this team to automatically track the events associated to users of this team."
|
||||
/>
|
||||
<field name="message_ids" />
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="pms_team_view_tree" model="ir.ui.view">
|
||||
<field name="name">pms.team.tree</field>
|
||||
<field name="model">pms.team</field>
|
||||
<field name="field_parent">child_ids</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="PMS Team" sample="1" multi_edit="1">
|
||||
<field name="sequence" widget="handle" />
|
||||
<field name="name" readonly="1" />
|
||||
<field name="active" invisible="1" />
|
||||
<field name="user_id" domain="[('share', '=', False)]" />
|
||||
<field name="pms_property_id" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="pms_team_view_kanban" model="ir.ui.view">
|
||||
<field name="name">pms.team.kanban</field>
|
||||
<field name="model">pms.team</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="o_kanban_mobile" sample="1">
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_content oe_kanban_global_click">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<strong><field name="name" /></strong>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<span class="float-right"><field
|
||||
name="user_id"
|
||||
/></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
<record id="pms_team_action" model="ir.actions.act_window">
|
||||
<field name="name">Teams</field>
|
||||
<field name="res_model">pms.team</field>
|
||||
<field name="view_mode">tree,form,kanban</field>
|
||||
</record>
|
||||
<menuitem
|
||||
action="pms_team_action"
|
||||
id="pms_team_menu"
|
||||
parent="pms.pms_configuration_menu"
|
||||
sequence="55"
|
||||
name="Teams"
|
||||
/>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user