diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/project/wizard | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/project/wizard')
| -rw-r--r-- | addons/project/wizard/__init__.py | 5 | ||||
| -rw-r--r-- | addons/project/wizard/project_delete_wizard.py | 28 | ||||
| -rw-r--r-- | addons/project/wizard/project_delete_wizard_views.xml | 29 | ||||
| -rw-r--r-- | addons/project/wizard/project_task_type_delete.py | 72 | ||||
| -rw-r--r-- | addons/project/wizard/project_task_type_delete_views.xml | 49 |
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> |
