Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions project_key/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# License LGPLv3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.en.html).

from . import main
from . import portal
24 changes: 24 additions & 0 deletions project_key/controllers/portal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Copyright 2026 Noviat
# License LGPLv3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.en.html).

from odoo.http import request

from odoo.addons.project.controllers.portal import ProjectCustomerPortal


class ProjectKeyCustomerPortal(ProjectCustomerPortal):
def _task_get_searchbar_inputs(self, milestones_allowed, project=False):
values = super()._task_get_searchbar_inputs(milestones_allowed, project)
values["key"] = {
"input": "key",
"label": request.env._("Search in Key"),
"sequence": 15,
}
return values

def _task_get_search_domain(self, search_in, search, milestones_allowed, project):
if search_in == "key":
return [("key", "ilike", search)]
return super()._task_get_search_domain(
search_in, search, milestones_allowed, project
)
8 changes: 8 additions & 0 deletions project_key/models/project_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ class Task(models.Model):

url = fields.Char(string="URL", compute="_compute_task_url")

@property
def TASK_PORTAL_READABLE_FIELDS(self):
# Expose `key` so it's readable in portal & project sharing views
# (otherwise the JS kanban arch parser crashes when reading
# record.fields.key.type because the field is filtered out by
# the server response spec).
return super().TASK_PORTAL_READABLE_FIELDS | {"key"}

_task_key_unique = models.Constraint(
"UNIQUE(key)",
"Task key must be unique!",
Expand Down
72 changes: 64 additions & 8 deletions project_key/views/project_key_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
<record id="view_task_tree2_extend_with_key" model="ir.ui.view">
<field name="name">project.task.list</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_tree2" />
<field name="inherit_id" ref="project.project_task_view_tree_main_base" />
<field eval="2" name="priority" />
<field name="arch" type="xml">
<field name="name" position="before">
Expand All @@ -71,7 +71,7 @@
<record id="view_task_search_key" model="ir.ui.view">
<field name="name">project.task.search.key</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_search_form" />
<field name="inherit_id" ref="project.view_task_search_form_base" />
<field name="arch" type="xml">
<field name="name" position="attributes">
<attribute
Expand All @@ -85,14 +85,13 @@
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_kanban" />
<field name="arch" type="xml">
<field name="color" position="after">
<field name="url" />
<xpath expr="//kanban/field[@name='stage_id']" position="after">
<field name="key" />
</field>
</xpath>
<xpath expr="//t[@t-name='card']//field[@name='name']" position="before">
<a t-att-href="record.url.raw_value">
<field name="key" />
</a>
<div t-if="record.key" class="mb-1">
<span class="badge text-bg-light" t-out="record.key.raw_value" />
</div>
</xpath>
</field>
</record>
Expand All @@ -106,4 +105,61 @@
</div>
</field>
</record>
<record id="view_task_kanban_key_project_sharing" model="ir.ui.view">
<field name="name">project.sharing.project.task.kanban.key</field>
<field name="model">project.task</field>
<field
name="inherit_id"
ref="project.project_sharing_project_task_view_kanban"
/>
<field name="active" eval="True" />
<field name="arch" type="xml">
<xpath expr="//kanban/field[@name='state']" position="after">
<field name="key" />
</xpath>
<xpath expr="//t[@t-name='card']//field[@name='name']" position="before">
<div t-if="record.key" class="mb-1">
<span class="badge text-bg-light" t-out="record.key.raw_value" />
</div>
</xpath>
</field>
</record>
<record id="view_task_form_key_project_sharing" model="ir.ui.view">
<field name="name">project.sharing.project.task.form.key</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.project_sharing_project_task_view_form" />
<field name="arch" type="xml">
<xpath expr="//h1//field[@name='name']" position="before">
<field name="key" readonly="1" nolabel="1" class="oe_inline" />
<span class="oe_inline"> : </span>
</xpath>
</field>
</record>
<template
id="portal_tasks_list_key"
name="Project Key: portal tasks list"
inherit_id="project.portal_tasks_list"
>
<xpath expr="//tr/td[span[@t-esc='task.id']]" position="attributes">
<attribute name="t-if">not task.key</attribute>
</xpath>
<xpath expr="//tr/td[span[@t-esc='task.id']]" position="after">
<td t-if="task.key" class="text-start">
<span t-esc="task.key" />
</td>
</xpath>
</template>
<template
id="portal_my_task_key"
name="Project Key: portal task page"
inherit_id="project.portal_my_task"
>
<xpath expr="//h3/span[@t-field='task.name']" position="before">
<span
t-if="task.key"
class="badge text-bg-secondary me-2"
t-esc="task.key"
/>
</xpath>
</template>
</odoo>
Loading