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

[UPD] end training email & add button to export survey on training

parent 79f712f4
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -4,7 +4,7 @@
"summary": "Link survey to training",
"license": "AGPL-3",
"author": "Le Filament",
"depends": ["training", "survey"],
"depends": ["training", "survey", "survey_xlsx"],
"contributors": [
"Benjamin <benjamin@le-filament.com>",
],
......@@ -15,8 +15,7 @@
"security/ir.model.access.csv",
# datas
"data/mail_aeci.xml",
"data/mail_aect.xml",
"data/mail_satisfaction.xml",
"data/mail_end_training.xml",
# templates
# views
"views/survey.xml",
......
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="mail_template_training_aect" model="mail.template">
<record id="mail_template_training_end" 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>
......@@ -31,8 +31,16 @@
</t>
<br />
je t’adresse les liens vers deux formulaires en ligne 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>
<ul>
<li>
<a t-att-href="env.context.get('aect_answer').get_start_url()">Autoévaluation des compétences terminales</a>
</li>
<li>
<a t-att-href="env.context.get('satisfaction_answer').get_start_url()">Evaluation de ta satisfaction</a>
</li>
</ul>
<br /><br />
Je te prie de bien vouloir trouver en pièce jointe ton <t t-out="object.get_certification_name()"/>
<br /><br />
Je te remercie et te souhaite bonne réception de ce courriel.
<br /><br />
......@@ -43,6 +51,7 @@
</p>
</div>
</field>
<field name="report_template" ref="training.report_attestation_pdf" />
<field name="lang">fr_FR</field>
<field name="auto_delete" eval="True" />
</record>
......
<?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>
......@@ -57,6 +57,22 @@ class Training(models.Model):
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def action_export_registration(self):
if self.registration_survey_id:
return self._get_survey_xlsx(self.registration_survey_id)
def action_export_aeci(self):
if self.aeci_survey_id:
return self._get_survey_xlsx(self.aeci_survey_id)
def action_export_aect(self):
if self.aect_survey_id:
return self._get_survey_xlsx(self.aect_survey_id)
def action_export_satisfaction(self):
if self.satisfaction_survey_id:
return self._get_survey_xlsx(self.satisfaction_survey_id)
def action_view_survey(self):
self.ensure_one()
return {
......@@ -68,16 +84,22 @@ class Training(models.Model):
"context": {"create": 0, "delete": 0},
}
def action_send_aect(self):
def action_send_end_training_data(self):
self.ensure_one()
aect_template_id = self.env.ref("training_survey.mail_template_training_aect")
self.action_done()
end_template_id = self.env.ref("training_survey.mail_template_training_end")
student_ids = self.student_ids.filtered(lambda s: s.state == "confirmed")
for student in student_ids:
student._create_and_send_survey(
self.aect_survey_id, aect_template_id
aect_answer = student._create_answer(self.aect_survey_id)
satisfaction_answer = student._create_answer(self.satisfaction_survey_id)
end_template_id.with_context(
aect_answer=aect_answer, satisfaction_answer=satisfaction_answer
).send_mail(
student.id,
email_layout_xmlid="training.mail_training_layout",
)
self.message_post(
subject="Questionnaire AECT envoyé",
subject="Questionnaires AECT et Satisfaction envoyés",
body=f"Participants : {', '.join(student_ids.mapped('partner_id.name'))}",
)
......@@ -105,5 +127,7 @@ class Training(models.Model):
super().action_valid()
# ------------------------------------------------------
# Buttons
# Business function
# ------------------------------------------------------
def _get_survey_xlsx(self, survey_id):
return self.env.ref("survey_xlsx.report_survey_xlsx").report_action(survey_id)
......@@ -13,12 +13,30 @@ class TrainingStudent(models.Model):
inverse_name="student_id",
string="Questionnaires",
)
registration_survey_id = fields.Many2one(
comodel_name="survey.user_input",
string="Inscription/Positionnement",
compute="_compute_registration_survey",
)
registration_state = fields.Selection(
[("new", "Pas commencé"), ("in_progress", "En cours"), ("done", "Terminé")],
compute="_compute_registration_survey",
string="Statut inscription",
store=False,
)
survey_count = fields.Integer(compute="_compute_survey_count")
aeci_sent = fields.Boolean(compute="_compute_aeci_sent")
# ------------------------------------------------------
# Compute
# ------------------------------------------------------
def _compute_registration_survey(self):
for student in self:
student.registration_survey_id = student.student_survey_ids.filtered(
lambda ui: ui.survey_id.training_survey_type == "subscribe"
)
student.registration_state = student.registration_survey_id.state
def _compute_survey_count(self):
for student in self:
student.survey_count = student.student_survey_ids.__len__()
......@@ -46,6 +64,17 @@ class TrainingStudent(models.Model):
"context": {"create": 0, "delete": 0},
}
def action_view_registration(self):
self.ensure_one()
return {
"name": f"Questionnaire Inscription {self.partner_id.name}",
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "survey.user_input",
"res_id": self.registration_survey_id.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(
......@@ -57,7 +86,9 @@ class TrainingStudent(models.Model):
# ------------------------------------------------------
def get_certification_name(self):
self.ensure_one()
if self.training_id.training_type_id == self.env.ref("training.training_type_present"):
if self.training_id.training_type_id == self.env.ref(
"training.training_type_present"
):
return "Attestation de fin de formation"
else:
return "Certificat de réalisation"
......@@ -83,6 +114,8 @@ class TrainingStudent(models.Model):
)
if not student_answer:
return self._init_answer(survey_id)
elif len(student_answer) == 1:
return student_answer
else:
raise UserError(
_(
......
......@@ -8,24 +8,14 @@
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button
name="action_send_aect"
type="object"
icon="fa-question-circle-o"
class="btn-info"
confirm="Valider l'envoi des questionnaires AECT ?"
attrs="{'invisible': ['|', ('is_passed', '=', False), ('is_filled', '=', False)]}"
>
Envoyer les questionnaires AECT
</button>
<button
name="action_send_satisfaction"
name="action_send_end_training_data"
type="object"
icon="fa-graduation-cap"
class="btn-info"
confirm="Valider l'envoi des certificats/attestations ?"
confirm="Cette action va envoyer à chaque participant les questionnaires d'inscription et de satisfaction, le certificat ou l'attestation, et passer la formation à l'état Terminé"
attrs="{'invisible': ['|', ('is_passed', '=', False), ('is_filled', '=', False)]}"
>
Envoyer certificats/attestations
Envoyer questionnaires AECT/Satisfaction et certificats/attestations
</button>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
......@@ -40,15 +30,69 @@
</xpath>
<xpath expr="//notebook" position="inside">
<page string="Questionnaires" name="survey">
<group>
<p class="o_horizontal_separator">
Inscription/Positionnement
</p>
<p>
<field name="registration_survey_id" class="me-4" />
<button
name="action_export_registration"
type="object"
icon="fa-file-o"
class="btn-outline-primary"
title="Exporter réponses positionnement"
attrs="{'invisible': [('registration_survey_id', '=', False)]}"
/>
</p>
<p class="o_horizontal_separator">
AECI
</p>
<p>
<field name="aeci_survey_id" class="me-4" />
<button
name="action_export_aeci"
type="object"
icon="fa-file-o"
class="btn-outline-primary"
title="Export réponses AECI"
attrs="{'invisible': [('aeci_survey_id', '=', False)]}"
/>
</p>
<p class="o_horizontal_separator">
AECT
</p>
<p>
<field name="aect_survey_id" class="me-4" />
<button
name="action_export_aect"
type="object"
icon="fa-file-o"
class="btn-outline-primary"
title="Export réponses AECT"
attrs="{'invisible': [('aect_survey_id', '=', False)]}"
/>
</p>
<p class="o_horizontal_separator">
Satisfaction
</p>
<p>
<field
name="satisfaction_survey_id"
class="me-4"
options="{'no_create': 1, 'no_edit': 1}"
/>
<field name="registration_survey_id" />
<field name="aeci_survey_id" />
<field name="aect_survey_id" />
</group>
<button
name="action_export_satisfaction"
type="object"
icon="fa-file-o"
class="btn-outline-primary"
title="Export réponses satisfaction"
attrs="{'invisible': [('satisfaction_survey_id', '=', False)]}"
/>
</p>
</page>
</xpath>
</field>
......
......@@ -16,11 +16,11 @@
options="{'no_create': 1, 'no_edit': 1}"
/>
<field
name="aect_survey_id"
name="aeci_survey_id"
options="{'no_create': 1, 'no_edit': 1}"
/>
<field
name="aeci_survey_id"
name="aect_survey_id"
options="{'no_create': 1, 'no_edit': 1}"
/>
</group>
......
......@@ -53,6 +53,23 @@
<field name="inherit_id" ref="training.training_student_tree" />
<field name="arch" type="xml">
<xpath expr="//field[@name='student_company']" position="after">
<field name="registration_survey_id" invisible="1" />
<button
name="action_view_registration"
type="object"
icon="fa-sign-in"
class="text-end"
title="Voir le questionnaire d'inscription"
attrs="{'invisible': [('registration_survey_id', '=', False)]}"
/>
<field
name="registration_state"
string="Quest. inscription"
widget="badge"
decoration-success="registration_state == 'done'"
decoration-warning="registration_state == 'new'"
decoration-info="registration_state == 'in_progress'"
/>
<field name="aeci_sent" invisible="1" />
<button
name="action_create_aeci"
......@@ -62,6 +79,12 @@
attrs="{'invisible': ['|', ('aeci_sent', '=', True), ('state', '!=', 'confirmed')]}"
/>
</xpath>
<!-- <xpath expr="//button[@name='action_confirmed']" position="attributes">-->
<!-- <attribute name="attrs">{'invisible': ['|', ('state', '=', 'confirmed'), ('registration_state', '!=', 'done')]}</attribute>-->
<!-- </xpath>-->
<!-- <xpath expr="//button[@name='action_unsuitable']" position="attributes">-->
<!-- <attribute name="attrs">{'invisible': ['|', ('state', '=', 'unsuitable'), ('registration_state', '!=', 'done')]}</attribute>-->
<!-- </xpath>-->
</field>
</record>
......
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