[ADD]mail_activity_plan addon

This commit is contained in:
2023-10-11 18:05:25 +02:00
parent 59aacc2d07
commit ee4e791185
11 changed files with 581 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.*~
*.pyc

View File

@@ -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 <https://github.com/elabore-coop/ux-tools/issues>`_. 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.

View File

@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models

View File

@@ -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
<https://github.com/elabore-coop/ux-tools/issues>`_. 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 <https://elabore.coop/web/image/res.company/1/logo?unique=f3db262>`_.
Contributors
------------
* Stéphan Sainléger <https://github.com/stephansainleger>
* 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,
}

View File

@@ -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 ""

View File

@@ -0,0 +1,2 @@
from . import mail_activity_plan
from . import ir_actions

View File

@@ -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

View File

@@ -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)

View File

@@ -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
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_mail_activity_plan mail_activity_plan model_mail_activity_plan 1 1 1 1
3 access_mail_activity_template mail_activity_template model_mail_activity_template 1 1 1 1

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model="ir.ui.view" id="view_server_action_form_template">
<field name="name">ir.actions.server.form</field>
<field name="model">ir.actions.server</field>
<field name="inherit_id" ref="base.view_server_action_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='state']" position="after">
<field name="plan_id" attrs="{'invisible': [('state', '!=', 'generate_activities')]}"/>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="mail_activity_plan_view_search" model="ir.ui.view">
<field name="name">mail.activity.plan.view.search</field>
<field name="model">mail.activity.plan</field>
<field name="arch" type="xml">
<search string="Plan">
<field name="name"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<record id="mail_activity_plan_view_tree" model="ir.ui.view">
<field name="name">mail.activity.plan.view.tree</field>
<field name="model">mail.activity.plan</field>
<field name="arch" type="xml">
<tree string="Planning">
<field name="name"/>
</tree>
</field>
</record>
<record id="mail_activity_plan_view_form" model="ir.ui.view">
<field name="name">mail.activity.plan.view.form</field>
<field name="model">mail.activity.plan</field>
<field name="arch" type="xml">
<form string="Planning">
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1>
<field name="name"/>
</h1>
</div>
<group string="Activities">
<field name="active" invisible="1"/>
<field name="mail_activity_template_ids" nolabel="1">
<tree editable="bottom">
<field name="mail_activity_type_id"/>
<field name="summary"/>
<field name="user_id"/>
</tree>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="mail_activity_template_view_tree" model="ir.ui.view">
<field name="name">mail.activity.template.view.tree</field>
<field name="model">mail.activity.template</field>
<field name="arch" type="xml">
<tree string="Activities">
<field name="mail_activity_type_id"/>
<field name="summary"/>
<field name="mail_activity_plan_ids"/>
</tree>
</field>
</record>
<record id="mail_activity_template_view_form" model="ir.ui.view">
<field name="name">mail.activity.template.view.form</field>
<field name="model">mail.activity.template</field>
<field name="arch" type="xml">
<form string="Activity">
<sheet>
<group>
<field name="mail_activity_type_id"/>
<field name="summary"/>
<field name="user_id"/>
<field name="mail_activity_plan_ids"/>
<field name="note"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="mail_activity_plan_action" model="ir.actions.act_window">
<field name="name">Activity plans</field>
<field name="res_model">mail.activity.plan</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="mail_activity_plan_view_search"/>
</record>
<menuitem
id="menu_mail_activity_plan"
action="mail_activity_plan_action"
parent="mail.mail_menu_technical"
sequence="12"
/>
<record id="mail_activity_template_action" model="ir.actions.act_window">
<field name="name">Activity templates</field>
<field name="res_model">mail.activity.template</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="menu_mail_activity_template"
action="mail_activity_template_action"
parent="mail.mail_menu_technical"
sequence="13"
/>
</data>
</odoo>