From ee4e791185e6a1d3f62f6618d97a46a778a80a09 Mon Sep 17 00:00:00 2001 From: Laetitia Da Costa Date: Wed, 11 Oct 2023 18:05:25 +0200 Subject: [PATCH] [ADD]mail_activity_plan addon --- .gitignore | 2 + mail_activity_plan/README.rst | 69 ++++++ mail_activity_plan/__init__.py | 4 + mail_activity_plan/__manifest__.py | 93 ++++++++ mail_activity_plan/i18n/fr.po | 206 ++++++++++++++++++ mail_activity_plan/models/__init__.py | 2 + mail_activity_plan/models/ir_actions.py | 32 +++ .../models/mail_activity_plan.py | 42 ++++ .../security/ir.model.access.csv | 3 + .../views/ir_actions_server_form_plan.xml | 15 ++ .../views/mail_activity_plan_view.xml | 113 ++++++++++ 11 files changed, 581 insertions(+) create mode 100644 .gitignore create mode 100644 mail_activity_plan/README.rst create mode 100644 mail_activity_plan/__init__.py create mode 100644 mail_activity_plan/__manifest__.py create mode 100644 mail_activity_plan/i18n/fr.po create mode 100644 mail_activity_plan/models/__init__.py create mode 100644 mail_activity_plan/models/ir_actions.py create mode 100644 mail_activity_plan/models/mail_activity_plan.py create mode 100644 mail_activity_plan/security/ir.model.access.csv create mode 100644 mail_activity_plan/views/ir_actions_server_form_plan.xml create mode 100644 mail_activity_plan/views/mail_activity_plan_view.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..551cb32 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.*~ +*.pyc diff --git a/mail_activity_plan/README.rst b/mail_activity_plan/README.rst new file mode 100644 index 0000000..41f372e --- /dev/null +++ b/mail_activity_plan/README.rst @@ -0,0 +1,69 @@ +==================== +mail_activity_plan +==================== + +Installation +============ +Use Odoo normal module installation procedure to install ``mail_activity_plan``. + + +Configuration +============= +To create activity templates, go to Settings > Technical > Discuss > Activity templates : + +Select a activiy type, select a user to assign, fiel the other fields (summary, note) + +To create activities plans, go to Settings > Technical > Discuss > Activity plans : + +Provide a name, select or create activity templates + +A plan can be related to many activity templates + +A activity template can be related to many plans + +A activity template is related to only one activity type + + +Usage +===== +Once your plan is configured, you can define a server-action to launch automatically the activities for a choose model + +Go to Settings > Technical > Actions > Server Actions + +Provide a name, select a model, select action "[generate_activities]", select a plan. + +Once your new server action is configured, go to an instance of the chosen model, +click on the server action to generate automatically the activities of the plan + +Known issues / Roadmap +====================== + +None yet. + +Bug Tracker +=========== + +Bugs are tracked on `our issues website `_. In case of +trouble, please check there if your issue has already been +reported. If you spotted it first, help us smashing it by providing a +detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ + +* Laetitia Da Costa (https://github.com/LaetitiaElabore) + +Funders +------- + +The development of this module has been financially supported by: +* Elabore (https://elabore.coop) + + +Maintainer +---------- + +This module is maintained by Elabore. \ No newline at end of file diff --git a/mail_activity_plan/__init__.py b/mail_activity_plan/__init__.py new file mode 100644 index 0000000..e991714 --- /dev/null +++ b/mail_activity_plan/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models \ No newline at end of file diff --git a/mail_activity_plan/__manifest__.py b/mail_activity_plan/__manifest__.py new file mode 100644 index 0000000..7ecc508 --- /dev/null +++ b/mail_activity_plan/__manifest__.py @@ -0,0 +1,93 @@ +# Copyright 2022 Laetitia Élabore (Elabore) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "mail_activity_plan", + "version": "14.0.1.0.0", + "author": "Elabore", + "website": "https://github.com/elabore-coop/ux-tools", + "maintainer": "Laetitia Da Costa", + "license": "AGPL-3", + "category": "Tools", + "summary": "Create activities plans through action server", + "description": """ + :image: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +================= +mail_activity_plan +================= + +Create activities plans through action server + +Installation +============ + +Install ``mail_activity_plan``, all dependencies will be installed by default. + +Known issues / Roadmap +====================== + +None yet. + +Bug Tracker +=========== + +Bugs are tracked on `our issues website +`_. In case of +trouble, please check there if your issue has already been +reported. If you spotted it first, help us smashing it by providing a +detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Elabore: `Icon `_. + +Contributors +------------ + +* Stéphan Sainléger +* Laetitia Da Costa + +Funders +------- + +The development of this module has been financially supported by: +* Elabore (https://elabore.coop) + + +Maintainer +---------- +This module is maintained by Elabore. + +""", + # any module necessary for this one to work correctly + "depends": [ + "base", + ], + "qweb": [ + # "static/src/xml/*.xml", + ], + "external_dependencies": { + "python": [], + }, + # always loaded + "data": [ + "security/ir.model.access.csv", + "views/mail_activity_plan_view.xml", + "views/ir_actions_server_form_plan.xml", + ], + # only loaded in demonstration mode + "demo": [], + "js": [], + "css": [], + "installable": True, + # Install this module automatically if all dependency have been previously + # and independently installed. Used for synergetic or glue modules. + "auto_install": False, + "application": False, +} diff --git a/mail_activity_plan/i18n/fr.po b/mail_activity_plan/i18n/fr.po new file mode 100644 index 0000000..93afdb6 --- /dev/null +++ b/mail_activity_plan/i18n/fr.po @@ -0,0 +1,206 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_activity_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-13 08:34+0000\n" +"PO-Revision-Date: 2023-10-13 08:34+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_base_automation__state +#: model:ir.model.fields,field_description:mail_activity_plan.field_ir_actions_server__state +#: model:ir.model.fields,field_description:mail_activity_plan.field_ir_cron__state +msgid "Action To Do" +msgstr "Action à effectuer" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__active +msgid "Active" +msgstr "" + +#. module: mail_activity_plan +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_plan_view_form +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_template_view_tree +msgid "Activities" +msgstr "Activités" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__mail_activity_plan_ids +msgid "Activities plan" +msgstr "Plan d'activités" + +#. module: mail_activity_plan +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_template_view_form +msgid "Activity" +msgstr "Activité" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__mail_activity_type_id +msgid "Activity Type" +msgstr "Type d'activité" + +#. module: mail_activity_plan +#: model:ir.actions.act_window,name:mail_activity_plan.mail_activity_plan_action +#: model:ir.ui.menu,name:mail_activity_plan.menu_mail_activity_plan +msgid "Activity plans" +msgstr "Plans d'activités" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__mail_activity_template_ids +msgid "Activity template" +msgstr "Modèle d'activité" + +#. module: mail_activity_plan +#: model:ir.actions.act_window,name:mail_activity_plan.mail_activity_template_action +#: model:ir.ui.menu,name:mail_activity_plan.menu_mail_activity_template +msgid "Activity templates" +msgstr "Modèles d'activités" + +#. module: mail_activity_plan +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_plan_view_form +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_plan_view_search +msgid "Archived" +msgstr "" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__user_id +msgid "Assigned to" +msgstr "Assigné à" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_base_automation__plan_id +#: model:ir.model.fields,field_description:mail_activity_plan.field_ir_actions_server__plan_id +#: model:ir.model.fields,field_description:mail_activity_plan.field_ir_cron__plan_id +msgid "Available plans" +msgstr "Plans d'activité disponibles" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__create_uid +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__create_uid +msgid "Created by" +msgstr "" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__create_date +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__create_date +msgid "Created on" +msgstr "" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_ir_actions_server__display_name +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__display_name +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: mail_activity_plan +#: model:ir.model.fields.selection,name:mail_activity_plan.selection__ir_actions_server__state__generate_activities +msgid "Generate activities from a plan" +msgstr "Générer les activités d'un plan d'activités" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_ir_actions_server__id +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__id +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__id +msgid "ID" +msgstr "" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_ir_actions_server____last_update +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan____last_update +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__write_uid +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__write_date +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__write_date +msgid "Last Updated on" +msgstr "" + +#. module: mail_activity_plan +#: model:ir.model,name:mail_activity_plan.model_mail_activity_plan +msgid "Mail activity plan" +msgstr "Plan d'activités" + +#. module: mail_activity_plan +#: model:ir.model,name:mail_activity_plan.model_mail_activity_template +msgid "Mail activity template" +msgstr "Modèle d'activités" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_plan__name +msgid "Name" +msgstr "Nom" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__note +msgid "Note" +msgstr "" + +#. module: mail_activity_plan +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_plan_view_search +msgid "Plan" +msgstr "" + +#. module: mail_activity_plan +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_plan_view_form +#: model_terms:ir.ui.view,arch_db:mail_activity_plan.mail_activity_plan_view_tree +msgid "Planning" +msgstr "" + +#. module: mail_activity_plan +#: model:ir.model,name:mail_activity_plan.model_ir_actions_server +msgid "Server Action" +msgstr "Action du serveur" + +#. module: mail_activity_plan +#: model:ir.model.fields,field_description:mail_activity_plan.field_mail_activity_template__summary +msgid "Summary" +msgstr "Résumé" + +#. module: mail_activity_plan +#: model:ir.model.fields,help:mail_activity_plan.field_base_automation__state +#: model:ir.model.fields,help:mail_activity_plan.field_ir_actions_server__state +#: model:ir.model.fields,help:mail_activity_plan.field_ir_cron__state +msgid "" +"Type of server action. The following values are available:\n" +"- 'Execute Python Code': a block of python code that will be executed\n" +"- 'Create': create a new record with new values\n" +"- 'Update a Record': update the values of a record\n" +"- 'Execute several actions': define an action that triggers several other server actions\n" +"- 'Send Email': automatically send an email (Discuss)\n" +"- 'Add Followers': add followers to a record (Discuss)\n" +"- 'Create Next Activity': create an activity (Discuss)" +msgstr "" +"Type d'action serveur. Les valeurs suivantes sont disponibles:\n" +"- 'Executer du code Python': un bloc de code python qui sera exécuté\n" +"- 'Créer': créer un nouvel enregistrement avec de nouvelles valeurs\n" +"- 'Mettre à jour un enregistrement': mettre à jour les valeurs d'un enregistrement\n" +"- 'Executer plusieurs actions': définir une action qui déclenche plusieurs autres actions serveur\n" +"- 'Envoyer E-Mail': envoyer un e-mail automatiquement (Discutez)\n" +"- 'Ajouter Abonnés': ajouter des abonnés à un enregistrement (Discutez)\n" +"- 'Créer une Nouvelle Activité': créer une activité (Discutez)\n" +"- 'Générer les activités d'un plan d'activités': créer automatiquement les activités du plan dans le modèle choisi" + +#. module: mail_activity_plan +#: model:ir.model.fields,help:mail_activity_plan.field_base_automation__plan_id +#: model:ir.model.fields,help:mail_activity_plan.field_ir_actions_server__plan_id +#: model:ir.model.fields,help:mail_activity_plan.field_ir_cron__plan_id +msgid "choose a plan to add in server action options" +msgstr "" diff --git a/mail_activity_plan/models/__init__.py b/mail_activity_plan/models/__init__.py new file mode 100644 index 0000000..cc917a6 --- /dev/null +++ b/mail_activity_plan/models/__init__.py @@ -0,0 +1,2 @@ +from . import mail_activity_plan +from . import ir_actions \ No newline at end of file diff --git a/mail_activity_plan/models/ir_actions.py b/mail_activity_plan/models/ir_actions.py new file mode 100644 index 0000000..dadc25d --- /dev/null +++ b/mail_activity_plan/models/ir_actions.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class IrActionsServer(models.Model): + """ Add activity plan option in server actions. """ + _inherit = 'ir.actions.server' + + state = fields.Selection(selection_add=[('generate_activities', 'Generate activities from a plan')], + ondelete={'generate_activities': 'cascade'}) + + plan_id = fields.Many2one('mail.activity.plan', string='Available plans', help='choose a plan to add in server action options') + + def _run_action_generate_activities_multi(self, eval_context=None): + ''' + Function called automaticly when lauching action server + See ir_actions._get_runner() + ''' + records = self.env[self.model_name].browse(self._context.get('active_ids', self._context.get('active_id'))) + for record in records : + for mail_activity_template in self.plan_id.mail_activity_template_ids: + date_deadline = self.env['mail.activity']._calculate_date_deadline(mail_activity_template.mail_activity_type_id) + record.activity_schedule( + activity_type_id=mail_activity_template.mail_activity_type_id.id, + summary=mail_activity_template.summary, + note=mail_activity_template.note, + user_id=mail_activity_template.user_id.id, + date_deadline=date_deadline + ) + return False + diff --git a/mail_activity_plan/models/mail_activity_plan.py b/mail_activity_plan/models/mail_activity_plan.py new file mode 100644 index 0000000..53c659a --- /dev/null +++ b/mail_activity_plan/models/mail_activity_plan.py @@ -0,0 +1,42 @@ +# -*- 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 UserError + +class MailActivityTemplate(models.Model): + ''' + Describe activities to run when lauching the associated plan + ''' + _name = 'mail.activity.template' + _description = 'Mail activity template' + + mail_activity_plan_ids = fields.Many2many('mail.activity.plan', string='Activities plan', ondelete='restrict') + + mail_activity_type_id = fields.Many2one( + 'mail.activity.type', 'Activity Type', + default=lambda self: self.env.ref('mail.mail_activity_data_todo'), + ondelete='restrict' + ) + summary = fields.Char('Summary', compute="_compute_default_summary", store=True, readonly=False) + user_id = fields.Many2one('res.users', string='Assigned to', required=True) + note = fields.Html('Note') + + @api.depends('mail_activity_type_id') + def _compute_default_summary(self): + for mail_activity_template in self: + if not mail_activity_template.summary and mail_activity_template.mail_activity_type_id and mail_activity_template.mail_activity_type_id.summary: + mail_activity_template.summary = mail_activity_template.mail_activity_type_id.summary + +class MailActivityPlan(models.Model): + ''' + Create a plan + A plan is linked to many templates of mail activity (mail.activity.template) + + ''' + _name = 'mail.activity.plan' + _description = 'Mail activity plan' + + name = fields.Char('Name', required=True) + mail_activity_template_ids = fields.Many2many('mail.activity.template', string='Activity template', ondelete='restrict') + active = fields.Boolean(default=True) diff --git a/mail_activity_plan/security/ir.model.access.csv b/mail_activity_plan/security/ir.model.access.csv new file mode 100644 index 0000000..55d9bd4 --- /dev/null +++ b/mail_activity_plan/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_mail_activity_plan,mail_activity_plan,model_mail_activity_plan,,1,1,1,1 +access_mail_activity_template,mail_activity_template,model_mail_activity_template,,1,1,1,1 \ No newline at end of file diff --git a/mail_activity_plan/views/ir_actions_server_form_plan.xml b/mail_activity_plan/views/ir_actions_server_form_plan.xml new file mode 100644 index 0000000..71a4014 --- /dev/null +++ b/mail_activity_plan/views/ir_actions_server_form_plan.xml @@ -0,0 +1,15 @@ + + + + + ir.actions.server.form + ir.actions.server + + + + + + + + + diff --git a/mail_activity_plan/views/mail_activity_plan_view.xml b/mail_activity_plan/views/mail_activity_plan_view.xml new file mode 100644 index 0000000..4aa50c6 --- /dev/null +++ b/mail_activity_plan/views/mail_activity_plan_view.xml @@ -0,0 +1,113 @@ + + + + + + mail.activity.plan.view.search + mail.activity.plan + + + + + + + + + + + mail.activity.plan.view.tree + mail.activity.plan + + + + + + + + + mail.activity.plan.view.form + mail.activity.plan + +
+ + +
+
+ + + + + + + + + + +
+
+
+
+ + + mail.activity.template.view.tree + mail.activity.template + + + + + + + + + + + mail.activity.template.view.form + mail.activity.template + +
+ + + + + + + + + +
+
+
+ + + Activity plans + mail.activity.plan + tree,form + + + + + + + Activity templates + mail.activity.template + tree,form + + + + +
+