summaryrefslogtreecommitdiff
path: root/addons/project/wizard
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/project/wizard
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/project/wizard')
-rw-r--r--addons/project/wizard/__init__.py5
-rw-r--r--addons/project/wizard/project_delete_wizard.py28
-rw-r--r--addons/project/wizard/project_delete_wizard_views.xml29
-rw-r--r--addons/project/wizard/project_task_type_delete.py72
-rw-r--r--addons/project/wizard/project_task_type_delete_views.xml49
5 files changed, 183 insertions, 0 deletions
diff --git a/addons/project/wizard/__init__.py b/addons/project/wizard/__init__.py
new file mode 100644
index 00000000..063a6b88
--- /dev/null
+++ b/addons/project/wizard/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import project_delete_wizard
+from . import project_task_type_delete
diff --git a/addons/project/wizard/project_delete_wizard.py b/addons/project/wizard/project_delete_wizard.py
new file mode 100644
index 00000000..00bb4aa5
--- /dev/null
+++ b/addons/project/wizard/project_delete_wizard.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class ProjectDelete(models.TransientModel):
+ _name = 'project.delete.wizard'
+ _description = 'Project Delete Wizard'
+
+ project_ids = fields.Many2many('project.project', string='Projects')
+ task_count = fields.Integer(compute='_compute_task_count')
+ projects_archived = fields.Boolean(compute='_compute_projects_archived')
+
+ def _compute_projects_archived(self):
+ for wizard in self.with_context(active_test=False):
+ wizard.projects_archived = all(not p.active for p in wizard.project_ids)
+
+ def _compute_task_count(self):
+ for wizard in self:
+ wizard.task_count = sum(wizard.with_context(active_test=False).project_ids.mapped('task_count'))
+
+ def action_archive(self):
+ self.project_ids.write({'active': False})
+
+ def confirm_delete(self):
+ self.with_context(active_test=False).project_ids.unlink()
+ return self.env["ir.actions.actions"]._for_xml_id("project.open_view_project_all_config")
diff --git a/addons/project/wizard/project_delete_wizard_views.xml b/addons/project/wizard/project_delete_wizard_views.xml
new file mode 100644
index 00000000..34e1d15b
--- /dev/null
+++ b/addons/project/wizard/project_delete_wizard_views.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <data>
+ <record id="project_delete_wizard_form" model="ir.ui.view">
+ <field name="name">Delete Project</field>
+ <field name="model">project.delete.wizard</field>
+ <field name="arch" type="xml">
+ <form string="Delete Project">
+ <field name="task_count" invisible="1" />
+ <field name="projects_archived" invisible="1" />
+ <group attrs="{'invisible': [('task_count', '=', 0)]}">
+ <span>You cannot delete a project containing tasks. You can either archive it or first delete all of its tasks.</span>
+ </group>
+ <group attrs="{'invisible': [('task_count', '>', 0)]}">
+ <span>Are you sure you want to delete this project ?</span>
+ </group>
+ <footer attrs="{'invisible': [('task_count', '=', 0)]}">
+ <button string="Archive project" type="object" name="action_archive" class="btn btn-primary" attrs="{'invisible': [('projects_archived', '=', True)]}" />
+ <button string="Discard" special="cancel" />
+ </footer>
+ <footer attrs="{'invisible': [('task_count', '>', 0)]}">
+ <button string="Ok" type="object" name="confirm_delete" class="btn btn-primary" />
+ <button string="Cancel" special="cancel" />
+ </footer>
+ </form>
+ </field>
+ </record>
+ </data>
+</odoo>
diff --git a/addons/project/wizard/project_task_type_delete.py b/addons/project/wizard/project_task_type_delete.py
new file mode 100644
index 00000000..7efbd55d
--- /dev/null
+++ b/addons/project/wizard/project_task_type_delete.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models, _
+from odoo.exceptions import ValidationError
+
+import ast
+
+
+class ProjectTaskTypeDelete(models.TransientModel):
+ _name = 'project.task.type.delete.wizard'
+ _description = 'Project Stage Delete Wizard'
+
+ project_ids = fields.Many2many('project.project', domain="['|', ('active', '=', False), ('active', '=', True)]", string='Projects', ondelete='cascade')
+ stage_ids = fields.Many2many('project.task.type', string='Stages To Delete', ondelete='cascade')
+ tasks_count = fields.Integer('Number of tasks', compute='_compute_tasks_count')
+ stages_active = fields.Boolean(compute='_compute_stages_active')
+
+ @api.depends('project_ids')
+ def _compute_tasks_count(self):
+ for wizard in self:
+ wizard.tasks_count = self.with_context(active_test=False).env['project.task'].search_count([('stage_id', 'in', wizard.stage_ids.ids)])
+
+ @api.depends('stage_ids')
+ def _compute_stages_active(self):
+ for wizard in self:
+ wizard.stages_active = all(wizard.stage_ids.mapped('active'))
+
+ def action_archive(self):
+ if len(self.project_ids) <= 1:
+ return self.action_confirm()
+
+ return {
+ 'name': _('Confirmation'),
+ 'view_mode': 'form',
+ 'res_model': 'project.task.type.delete.wizard',
+ 'views': [(self.env.ref('project.view_project_task_type_delete_confirmation_wizard').id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'res_id': self.id,
+ 'target': 'new',
+ 'context': self.env.context,
+ }
+
+ def action_confirm(self):
+ tasks = self.with_context(active_test=False).env['project.task'].search([('stage_id', 'in', self.stage_ids.ids)])
+ tasks.write({'active': False})
+ self.stage_ids.write({'active': False})
+ return self._get_action()
+
+ def action_unlink(self):
+ self.stage_ids.unlink()
+ return self._get_action()
+
+ def _get_action(self):
+ project_id = self.env.context.get('default_project_id')
+
+ if project_id:
+ action = self.env["ir.actions.actions"]._for_xml_id("project.action_view_task")
+ action['domain'] = [('project_id', '=', project_id)]
+ action['context'] = str({
+ 'pivot_row_groupby': ['user_id'],
+ 'default_project_id': project_id,
+ })
+ elif self.env.context.get('stage_view'):
+ action = self.env["ir.actions.actions"]._for_xml_id("project.open_task_type_form")
+ else:
+ action = self.env["ir.actions.actions"]._for_xml_id("project.action_view_all_task")
+
+ context = dict(ast.literal_eval(action.get('context')), active_test=True)
+ action['context'] = context
+ action['target'] = 'main'
+ return action
diff --git a/addons/project/wizard/project_task_type_delete_views.xml b/addons/project/wizard/project_task_type_delete_views.xml
new file mode 100644
index 00000000..a0bc0001
--- /dev/null
+++ b/addons/project/wizard/project_task_type_delete_views.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="view_project_task_type_delete_wizard" model="ir.ui.view">
+ <field name="name">project.task.type.delete.wizard.form</field>
+ <field name="model">project.task.type.delete.wizard</field>
+ <field name="arch" type="xml">
+ <form string="Delete Stage">
+ <field name="tasks_count" invisible="1" />
+ <field name="stages_active" invisible="1" />
+ <div attrs="{'invisible': [('tasks_count', '>', 0)]}">
+ <p>Are you sure you want to delete those stages ?</p>
+ </div>
+ <div attrs="{'invisible': ['|', ('stages_active', '=', False), ('tasks_count', '=', 0)]}">
+ <p>You cannot delete stages containing tasks. You can either archive them or first delete all of their tasks.</p>
+ </div>
+ <div attrs="{'invisible': ['|', ('stages_active', '=', True), ('tasks_count', '=', 0)]}">
+ <p>You cannot delete stages containing tasks. You should first delete all of their tasks.</p>
+ </div>
+ <footer>
+ <button string="Archive Stages" type="object" name="action_archive" class="btn btn-primary" attrs="{'invisible': ['|', ('stages_active', '=', False), ('tasks_count', '=', 0)]}" />
+ <button string="Delete" type="object" name="action_unlink" class="btn btn-primary" attrs="{'invisible': [('tasks_count', '>', 0)]}" />
+ <button string="Discard" special="cancel" />
+ </footer>
+ </form>
+ </field>
+ </record>
+
+ <record id="view_project_task_type_delete_confirmation_wizard" model="ir.ui.view">
+ <field name="name">project.task.type.delete.wizard.form</field>
+ <field name="model">project.task.type.delete.wizard</field>
+ <field name="arch" type="xml">
+ <form string="Delete Stage">
+ <div>
+ <p>This will archive the stages and all the tasks they contain from the following projects:</p>
+ <field name="project_ids" readonly="1">
+ <tree>
+ <field name="name"/>
+ </tree>
+ </field>
+ <p>Are you sure you want to continue?</p>
+ </div>
+ <footer>
+ <button string="Confirm" type="object" name="action_confirm" class="btn btn-primary"/>
+ <button string="Discard" special="cancel" />
+ </footer>
+ </form>
+ </field>
+ </record>
+</odoo>