mirror of
https://github.com/bringout/oca-project.git
synced 2026-04-19 15:02:07 +02:00
Move 124 sale modules to oca-sale, create oca-project with 56 project modules from oca-workflow-process
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
9eb7ae5807
commit
6094c218b2
2332 changed files with 125826 additions and 0 deletions
|
|
@ -0,0 +1 @@
|
|||
from . import project_task_merge
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
from odoo import _, fields, models
|
||||
|
||||
|
||||
class ProjectTaskMerge(models.TransientModel):
|
||||
_name = "project.task.merge"
|
||||
_description = "Project Task Merge"
|
||||
|
||||
task_ids = fields.Many2many("project.task", string="Tasks to Merge", required=True)
|
||||
user_ids = fields.Many2many("res.users", string="Assignees")
|
||||
create_new_task = fields.Boolean("Create a new task")
|
||||
dst_task_name = fields.Char("New task name")
|
||||
dst_project_id = fields.Many2one("project.project", string="Destination Project")
|
||||
dst_task_id = fields.Many2one("project.task", string="Merge into an existing task")
|
||||
|
||||
def merge_tasks(self):
|
||||
tag_ids = self.task_ids.mapped("tag_ids").ids
|
||||
attachment_ids = self.task_ids.mapped("attachment_ids").ids
|
||||
values = {
|
||||
"description": self.merge_description(),
|
||||
"tag_ids": [(4, tag_id) for tag_id in tag_ids],
|
||||
"attachment_ids": [(4, attachment_id) for attachment_id in attachment_ids],
|
||||
"user_ids": self.user_ids.ids,
|
||||
}
|
||||
if self.create_new_task:
|
||||
partner_ids = self.task_ids.mapped("partner_id")
|
||||
priorities = self.task_ids.mapped("priority")
|
||||
values.update(
|
||||
{
|
||||
"name": self.dst_task_name,
|
||||
"project_id": self.dst_project_id.id,
|
||||
"partner_id": len(set(partner_ids)) == 1
|
||||
and partner_ids[0].id
|
||||
or False,
|
||||
"priority": len(set(priorities)) == 1 and priorities[0] or False,
|
||||
}
|
||||
)
|
||||
self.dst_task_id = self.env["project.task"].create(values)
|
||||
else:
|
||||
self.dst_task_id.write(values)
|
||||
merged_tasks = self.task_ids - self.dst_task_id
|
||||
self._merge_followers(merged_tasks)
|
||||
for task in merged_tasks:
|
||||
self._add_message("to", self.dst_task_id.name, task)
|
||||
task_names = ", ".join(merged_tasks.mapped("name"))
|
||||
self._add_message("from", task_names, self.dst_task_id)
|
||||
merged_tasks.write({"active": False})
|
||||
return {
|
||||
"type": "ir.actions.act_window",
|
||||
"res_model": "project.task",
|
||||
"views": [[False, "form"]],
|
||||
"res_id": self.dst_task_id.id,
|
||||
}
|
||||
|
||||
def merge_description(self):
|
||||
return "<br/>".join(
|
||||
self.task_ids.filtered(lambda t: t.description).mapped(
|
||||
lambda task: "Description from task <b>%s</b>:<br/>%s"
|
||||
% (task.name, task.description)
|
||||
)
|
||||
)
|
||||
|
||||
def _merge_followers(self, merged_tasks):
|
||||
self.dst_task_id.message_subscribe(
|
||||
partner_ids=(merged_tasks).mapped("message_partner_ids").ids
|
||||
)
|
||||
|
||||
def default_get(self, fields):
|
||||
result = super(ProjectTaskMerge, self).default_get(fields)
|
||||
selected_tasks = self.env["project.task"].browse(
|
||||
self.env.context.get("active_ids", False)
|
||||
)
|
||||
assigned_tasks = selected_tasks.filtered(lambda task: task.user_ids)
|
||||
result.update(
|
||||
{
|
||||
"task_ids": selected_tasks.ids,
|
||||
"user_ids": assigned_tasks
|
||||
and assigned_tasks.mapped("user_ids").ids
|
||||
or False,
|
||||
"dst_project_id": selected_tasks[0].project_id.id,
|
||||
"dst_task_id": selected_tasks[0].id,
|
||||
}
|
||||
)
|
||||
return result
|
||||
|
||||
def _add_message(self, way, task_names, task):
|
||||
"""Send a message post with to advise the project task about the merge.
|
||||
:param way : choice between "from" or "to"
|
||||
:param task_names : list of project task names to add in the body
|
||||
:param task : the task where the message will be posted
|
||||
"""
|
||||
subject = "Merge project task"
|
||||
body = _(f"This project task has been merged {way} {task_names}")
|
||||
|
||||
task.message_post(body=body, subject=subject, content_subtype="plaintext")
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="project_task_merge_view_form" model="ir.ui.view">
|
||||
<field name='name'>project.task.merge.form</field>
|
||||
<field name='model'>project.task.merge</field>
|
||||
<field name='arch' type='xml'>
|
||||
<form string='Merge Tasks'>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="user_ids" widget="many2many_tags_avatar" />
|
||||
<field name="task_ids" widget="many2many_tags" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="create_new_task" />
|
||||
<field
|
||||
name="dst_task_name"
|
||||
attrs="{'invisible': [('create_new_task', '=', False)], 'required': [('create_new_task', '=', True)]}"
|
||||
/>
|
||||
<field
|
||||
name="dst_project_id"
|
||||
attrs="{'invisible': [('create_new_task', '=', False)], 'required': [('create_new_task', '=', True)]}"
|
||||
/>
|
||||
<field
|
||||
name="dst_task_id"
|
||||
attrs="{'invisible': [('create_new_task', '=', True)], 'required': [('create_new_task', '=', False)]}"
|
||||
/>
|
||||
</group>
|
||||
</group>
|
||||
<span
|
||||
class="text-muted"
|
||||
>NB: This will archive the selected tasks (Except the destination task)</span>
|
||||
</sheet>
|
||||
<footer>
|
||||
<button
|
||||
name='merge_tasks'
|
||||
string='Merge Tasks'
|
||||
class='oe_highlight'
|
||||
type='object'
|
||||
/>
|
||||
<button
|
||||
special="cancel"
|
||||
string="Cancel"
|
||||
type="object"
|
||||
class="btn btn-default oe_inline"
|
||||
/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="action_project_task_merge" model="ir.actions.act_window">
|
||||
<field name="name">Merge Project Tasks</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">project.task.merge</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="binding_model_id" ref="project.model_project_task" />
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Loading…
Add table
Add a link
Reference in a new issue