Skip to content
Extraits de code Groupes Projets
Valider a1c60a1c rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

[IMP] link between student an user input, change views, add email

parent b3b26cbf
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -58,7 +58,7 @@ repos:
rev: v2.7.1
hooks:
- id: prettier
exclude: ^templates/
exclude: ^templates/,^data/
name: prettier (with plugin-xml)
additional_dependencies:
- "prettier@2.7.1"
......
......@@ -14,11 +14,16 @@
# security
"security/ir.model.access.csv",
# datas
"data/mail_aeci.xml",
"data/mail_aect.xml",
"data/mail_satisfaction.xml",
# templates
# views
"views/survey.xml",
"views/survey_user_input.xml",
"views/training.xml",
"views/training_program.xml",
"views/training_student.xml",
# menus
"views/menus.xml",
],
......
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="mail_template_training_aeci" model="mail.template">
<field name="name">CG Scop - Formation - AECI</field>
<field name="model_id" ref="training.model_training_student" />
<field name="subject">Formation {{ object.training_id.program_id.name }} - Questionnaire AECI</field>
<field name="email_from">lbrien@scop.coop &lt;Laurence BRIEN&gt;</field>
<field name="email_to">{{ (object.partner_id.email or object.email) }}</field>
<field name="description">Mail envoyé au stagiaire pour le questionnaire AECI</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px; font-size: 13px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
Bonjour,
<br /><br />
En prévision de ta participation à la formation <t t-out="object.training_id.program_id.name">Nom Formation</t>
qui se tiendra
<t t-if="len(object.training_id.slot_ids) == 1">
le <t
t-out="object.training_id.slot_ids[0].date_start"
t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}"
>05/05/2024</t> de
<t
t-out="object.training_id.slot_ids[0].date_start"
t-options="{'widget': 'datetime', 'format': 'HH:mm'}"
>09:00</t> à
<t
t-out="object.training_id.slot_ids[0].date_end"
t-options="{'widget': 'datetime', 'format': 'HH:mm'}"
>12:00</t>
</t>
<t t-else="">
aux dates suivantes :
<ul>
<li t-foreach="object.training_id.slot_ids" t-as="slot">
<t t-out="slot.date_start" t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}">05/05/2024</t> de
<t t-out="slot.date_start" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">09:00</t> à
<t t-out="slot.date_end" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">12:00</t>
</li>
</ul>
</t>
je te serai reconnaissante de bien vouloir renseigner le formulaire d'autoévaluation des compétences initiales ci-après :
<br />
<a class="btn btn-info" t-att-href="env.context.get('survey_user_input').get_start_url()">Questionnaire AECI</a>
<br /><br />
Je te remercie et te souhaite bonne réception de ce courriel.
<br /><br />
Bonne journée.
<br />
Laurence Brien<br />
Déléguée à la formation professionnelle
</p>
</div>
</field>
<field name="lang">fr_FR</field>
<field name="auto_delete" eval="True" />
</record>
</odoo>
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="mail_template_training_aect" model="mail.template">
<field name="name">CG Scop - Formation - AECT</field>
<field name="model_id" ref="training.model_training_student" />
<field name="subject">Formation {{ object.training_id.program_id.name }} - Questionnaire AECT</field>
<field name="email_from">lbrien@scop.coop &lt;Laurence BRIEN&gt;</field>
<field name="email_to">{{ (object.partner_id.email or object.email) }}</field>
<field name="description">Mail envoyé au stagiaire pour le questionnaire AECT</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px; font-size: 13px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
Bonjour,
<br /><br />
Pour donner suite à ta participation à la formation <t t-out="object.training_id.program_id.name">Nom Formation</t>
qui s’est tenue
<t t-if="len(object.training_id.slot_ids) == 1">
le <t t-out="object.training_id.slot_ids[0].date_start" t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}">05/05/2024</t> de
<t t-out="object.training_id.slot_ids[0].date_start" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">09:00</t> à
<t t-out="object.training_id.slot_ids[0].date_end" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">12:00</t>
</t>
<t t-else="">
aux dates suivantes :
<ul>
<li t-foreach="object.training_id.slot_ids" t-as="slot">
<t t-out="slot.date_start" t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}">05/05/2024</t> de
<t t-out="slot.date_start" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">09:00</t> à
<t t-out="slot.date_end" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">12:00</t>
</li>
</ul>
</t>
<br />
je t’adresse le lien vers le formulaire d'autoévaluation des compétences terminales que tu voudras bien renseigner :
<br />
<a class="btn btn-info" t-att-href="env.context.get('survey_user_input').get_start_url()">Autoévaluation des compétences terminales</a>
<br /><br />
Je te remercie et te souhaite bonne réception de ce courriel.
<br /><br />
Bonne journée.
<br />
Laurence Brien<br />
Déléguée à la formation professionnelle
</p>
</div>
</field>
<field name="lang">fr_FR</field>
<field name="auto_delete" eval="True" />
</record>
</odoo>
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="mail_template_training_satisfaction" model="mail.template">
<field name="name">CG Scop - Formation - Satisfaction</field>
<field name="model_id" ref="training.model_training_student" />
<field name="subject">Formation {{ object.training_id.program_id.name }} - {{ object.get_certification_name() }}</field>
<field name="email_from">lbrien@scop.coop &lt;Laurence BRIEN&gt;</field>
<field name="email_to">{{ (object.partner_id.email or object.email) }}</field>
<field name="description">Mail envoyé au stagiaire pour fe certificat ou l'attestation de formation</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px; font-size: 13px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
Bonjour,
<br /><br />
Pour donner suite à ta participation à la formation <t t-out="object.training_id.program_id.name">Nom Formation</t>
qui s’est tenue
<t t-if="len(object.training_id.slot_ids) == 1">
le <t t-out="object.training_id.slot_ids[0].date_start" t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}">05/05/2024</t> de
<t t-out="object.training_id.slot_ids[0].date_start" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">09:00</t> à
<t t-out="object.training_id.slot_ids[0].date_end" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">12:00</t>
</t>
<t t-else="">
aux dates suivantes :
<ul>
<li t-foreach="object.training_id.slot_ids" t-as="slot">
<t t-out="slot.date_start" t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}">05/05/2024</t> de
<t t-out="slot.date_start" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">09:00</t> à
<t t-out="slot.date_end" t-options="{'widget': 'datetime', 'format': 'HH:mm'}">12:00</t>
</li>
</ul>
</t>
je te prie de bien vouloir trouver en pièce jointe ton <t t-out="object.get_certification_name()"/>
<br /><br />
Je t’adresse un lien vers le formulaire en ligne que tu voudras bien renseigner:
<a class="btn btn-info" t-att-href="env.context.get('survey_user_input').get_start_url()">Evaluation de ta satisfaction</a>
<br /><br />
Je te remercie et te souhaite bonne réception de ce courriel.
<br /><br />
Bonne journée.
<br />
Laurence Brien<br />
Déléguée à la formation professionnelle
</p>
</div>
</field>
<field name="report_template" ref="training.report_attestation_pdf" />
<field name="report_name">{{ object.get_certification_name() }} - {{ object.partner_id.name }}</field>
<field name="lang">fr_FR</field>
<field name="auto_delete" eval="True" />
</record>
</odoo>
......@@ -10,6 +10,16 @@ class SurveyUserInput(models.Model):
student_id = fields.Many2one(
comodel_name="training.student",
string="Stagiaire",
ondelete="cascade",
)
training_id = fields.Many2one(
comodel_name="training.training",
string="Formation",
ondelete="cascade",
)
training_survey_type = fields.Selection(
string="Type de questionnaire formation",
related="survey_id.training_survey_type",
)
# ------------------------------------------------------
......
......@@ -17,6 +17,21 @@ class Training(models.Model):
],
ondelete="restrict",
)
registration_survey_id = fields.Many2one(
comodel_name="survey.survey",
string="Inscription/Positionnement",
related="program_id.registration_survey_id",
)
aeci_survey_id = fields.Many2one(
comodel_name="survey.survey",
string="AECI",
related="program_id.aeci_survey_id",
)
aect_survey_id = fields.Many2one(
comodel_name="survey.survey",
string="AECT",
related="program_id.aect_survey_id",
)
survey_ids = fields.One2many(
comodel_name="survey.survey",
......
# Copyright 2024 Le Filament (<https://le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
from odoo import _, fields, models
from odoo.exceptions import UserError
class TrainingStudent(models.Model):
......@@ -12,11 +13,119 @@ class TrainingStudent(models.Model):
inverse_name="student_id",
string="Questionnaires",
)
survey_count = fields.Integer(compute="_compute_survey_count")
aeci_sent = fields.Boolean(compute="_compute_aeci_sent")
# ------------------------------------------------------
# Compute
# ------------------------------------------------------
def _compute_survey_count(self):
for student in self:
student.survey_count = student.student_survey_ids.__len__()
def _compute_aeci_sent(self):
for student in self:
aeci = student.student_survey_ids.filtered(
lambda ui: ui.survey_id.training_survey_type == "AECI"
)
student.aeci_sent = True if aeci else False
# ------------------------------------------------------
# Action buttons
# ------------------------------------------------------
def action_view_survey(self):
self.ensure_one()
return {
"name": f"Questionnaires {self.partner_id.name}",
"type": "ir.actions.act_window",
"view_mode": "kanban,tree,form,activity",
"res_model": "survey.user_input",
"domain": [
("student_id", "=", self.id),
],
"context": {"create": 0, "delete": 0},
}
def action_create_aeci(self):
aeci_template_id = self.env.ref("training_survey.mail_template_training_aeci")
self._create_and_send_survey(
self.training_id.program_id.aeci_survey_id, aeci_template_id
)
def action_create_aect(self):
aect_template_id = self.env.ref("training_survey.mail_template_training_aect")
self._create_and_send_survey(
self.training_id.program_id.aect_survey_id, aect_template_id
)
def action_create_satisfaction(self):
aect_template_id = self.env.ref(
"training_survey.mail_template_training_satisfaction"
)
self._create_and_send_survey(
self.training_id.program_id.aect_survey_id, aect_template_id
)
# ------------------------------------------------------
# Inherit parent
# Business methods
# ------------------------------------------------------
def get_certification_name(self):
self.ensure_one()
if self.training_id.training_type_id == self.env.ref("training_type_present"):
return "Attestation de fin de formation"
else:
return "Certificat de réalisation"
def _create_and_send_survey(self, survey_id, template_id):
"""
Crée la réponse de l'utilisateur et envoie un email sur le template défini:
:param survey_id: survey.survey
:param template_id: email template
"""
for student in self:
answer_id = student._create_answer(survey_id)
# Envoie le mail de confirmation d'inscription à l'UP
template_id.with_context(survey_user_input=answer_id).send_mail(
student.id,
email_layout_xmlid="training.mail_training_layout",
)
def _create_answer(self, survey_id):
self.ensure_one()
student_answer = survey_id.user_input_ids.filtered(
lambda ui: ui.student_id == self and ui.training_id == self.training_id
)
if not student_answer:
return self._init_answer(survey_id)
else:
raise UserError(
_(
f"La réponse pour le questionnaire {survey_id.title} de la formation "
f"{self.training_id.program_id.name} a déjà été initialisée pour "
f"{self.partner_id.name}"
)
)
def _init_answer(self, survey_id):
"""
Initialise la réponse pour un stagiaire et un questionnaire donné
"""
answer_id = self.student_survey_ids.create(
{
"partner_id": self.partner_id.id,
"email": self.partner_id.email,
"nickname": self.partner_id.lastname,
"firstname": self.partner_id.firstname,
"company": self.student_company,
"survey_id": survey_id.id,
"student_id": self.id,
"training_id": self.training_id.id,
}
)
answer_id._create_input_line("email")
answer_id._create_input_line("firstname")
answer_id._create_input_line("nickname")
answer_id._create_input_line("company")
return answer_id
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Form View -->
<record id="survey_user_input_training_form" model="ir.ui.view">
<field name="name">survey.user_input.training.form</field>
<field name="model">survey.user_input</field>
<field name="inherit_id" ref="survey.survey_user_input_view_form" />
<field name="priority">60</field>
<field name="arch" type="xml">
<xpath
expr="//sheet/group/group/field[@name='test_entry']"
position="after"
>
<field
name="training_id"
readonly="1"
attrs="{'invisible': [('training_id', '=', False)]}"
/>
<field
name="training_survey_type"
attrs="{'invisible': [('training_survey_type', '=', False)]}"
/>
</xpath>
</field>
</record>
<!-- Form View -->
<record id="survey_user_input_training_kanban" model="ir.ui.view">
<field name="name">survey.user_input.training.kanban</field>
<field name="model">survey.user_input</field>
<field name="inherit_id" ref="survey.survey_user_input_viuew_kanban" />
<field name="priority">60</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='state']" position="after">
<field name="training_survey_type" />
</xpath>
<xpath expr="//div[hasclass('o_kanban_record_top')]" position="after">
<div class="text-center mb-2 mt-2">
<field name="training_survey_type" widget="badge" />
</div>
</xpath>
</field>
</record>
</odoo>
......@@ -24,6 +24,9 @@
name="satisfaction_survey_id"
options="{'no_create': 1, 'no_edit': 1}"
/>
<field name="registration_survey_id" />
<field name="aeci_survey_id" />
<field name="aect_survey_id" />
</group>
</group>
</page>
......
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Form View -->
<record id="training_student_form" model="ir.ui.view">
<field name="name">training.student.survey.form</field>
<field name="model">training.student</field>
<field name="inherit_id" ref="training.training_student_form" />
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<field name="aeci_sent" invisible="1" />
<button
name="action_create_aeci"
type="object"
string="Envoyer AECI"
class="btn-primary"
attrs="{'invisible': ['|', ('aeci_sent', '=', True), ('state', '!=', 'confirmed')]}"
/>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
<button
name="action_view_survey"
type="object"
icon="fa-question-circle-o"
class="oe_stat_button"
>
<field
name="survey_count"
string="Réponses questionnaires"
widget="statinfo"
/>
</button>
</xpath>
</field>
</record>
<!-- Tree View -->
<record id="training_student_tree" model="ir.ui.view">
<field name="name">training.student.survey.tree</field>
<field name="model">training.student</field>
<field name="inherit_id" ref="training.training_student_tree" />
<field name="arch" type="xml">
<xpath expr="//field[@name='student_company']" position="after">
<field name="aeci_sent" invisible="1" />
<button
name="action_create_aeci"
type="object"
string="Envoyer AECI"
class="btn-outline-primary"
attrs="{'invisible': ['|', ('aeci_sent', '=', True), ('state', '!=', 'confirmed')]}"
/>
</xpath>
</field>
</record>
</odoo>
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter