auto send email
This commit is contained in:
@@ -18,7 +18,7 @@ Academy Management
|
|||||||
'version': '0.1',
|
'version': '0.1',
|
||||||
|
|
||||||
# any module necessary for this one to work correctly
|
# any module necessary for this one to work correctly
|
||||||
'depends': ['base'],
|
'depends': ['base', 'mail'],
|
||||||
|
|
||||||
# always loaded
|
# always loaded
|
||||||
'data': [
|
'data': [
|
||||||
@@ -29,6 +29,8 @@ Academy Management
|
|||||||
'views/academy_schedule_views.xml',
|
'views/academy_schedule_views.xml',
|
||||||
'views/academy_student_views.xml',
|
'views/academy_student_views.xml',
|
||||||
'views/academy_teacher_views.xml',
|
'views/academy_teacher_views.xml',
|
||||||
|
'data/email_template_reminder.xml',
|
||||||
|
'data/scheduled_action_cron.xml',
|
||||||
'views/academy_menus.xml',
|
'views/academy_menus.xml',
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<data>
|
||||||
|
<record id="email_template_reminder" model="mail.template">
|
||||||
|
<field name="name">Nhắc nhở lịch học</field>
|
||||||
|
<field name="model_id" ref="academy_management.model_academy_schedule" />
|
||||||
|
<field name="subject">[Nhắc nhở] Bạn có buổi học "{{ object.name }}" vào {{ object.date.strftime('%d/%m/%Y %H:%M') }}</field>
|
||||||
|
<field name="email_to">{{ ','.join(object.student_ids.mapped('email'))}}</field>
|
||||||
|
<field name="body_html" type="html">
|
||||||
|
<p>Chào bạn,</p>
|
||||||
|
<p>Đây là lời nhắc rằng bạn có buổi học sắp diễn ra với thông tin chi tiết như sau:</p>
|
||||||
|
<table border="0" cellpadding="5" cellspacing="0">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<strong>📚 Tên lịch học:</strong>
|
||||||
|
</td>
|
||||||
|
<td><t t-out="object.name"></t></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<strong>🎓 Khóa học:</strong>
|
||||||
|
</td>
|
||||||
|
<td><t t-out="object.course_id.name"></t></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<strong>👨🏫 Giáo viên:</strong>
|
||||||
|
</td>
|
||||||
|
<td><t t-out="object.teacher_id.name"></t></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<strong>🗓️ Thời gian:</strong>
|
||||||
|
</td>
|
||||||
|
<td><t t-out="object.date.strftime('%H:%M')"></t> ngày <t t-out="object.date.strftime('%d/%m/%Y')"></t></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<strong>⏳ Thời lượng:</strong>
|
||||||
|
</td>
|
||||||
|
<td><t t-out="object.duration"></t> tiếng</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>Vui lòng chuẩn bị đầy đủ tài liệu và tham gia đúng giờ nhé!</p>
|
||||||
|
<p>Trân trọng,</p>
|
||||||
|
<p>Phòng đào tạo</p>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<data>
|
||||||
|
<record id="ir_cron_send_training_reminders" model="ir.cron">
|
||||||
|
<field name="name">Nhắc nhở lịch học</field>
|
||||||
|
<field name="model_id" ref="academy_management.model_academy_schedule" />
|
||||||
|
<field name="state">code</field>
|
||||||
|
<field name="code">model._send_reminder()</field>
|
||||||
|
<field name="interval_number">1</field>
|
||||||
|
<field name="interval_type">minutes</field>
|
||||||
|
<!-- <field name="numbercall">-1</field> -->
|
||||||
|
<!-- <field name="doall" eval="False" /> -->
|
||||||
|
<field name="active" eval="True" />
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
class AcademySchedule(models.Model):
|
class AcademySchedule(models.Model):
|
||||||
_name = 'academy.schedule'
|
_name = 'academy.schedule'
|
||||||
@@ -15,10 +16,32 @@ class AcademySchedule(models.Model):
|
|||||||
('confirmed', 'Xác nhận'),
|
('confirmed', 'Xác nhận'),
|
||||||
('cancel', 'Đã hủy')
|
('cancel', 'Đã hủy')
|
||||||
], string='Trạng thái', default='draft', required=True)
|
], string='Trạng thái', default='draft', required=True)
|
||||||
|
reminder_sent = fields.Boolean(string="Reminder Sent", default=False)
|
||||||
|
|
||||||
def action_confirm(self):
|
def action_confirm(self):
|
||||||
self.state = 'confirmed'
|
self.state = 'confirmed'
|
||||||
|
|
||||||
def action_cancel(self):
|
def action_cancel(self):
|
||||||
self.state = 'cancel'
|
self.state = 'cancel'
|
||||||
|
|
||||||
|
def _send_reminder(self):
|
||||||
|
now = fields.Datetime.now()
|
||||||
|
next_day = now + timedelta(days=1)
|
||||||
|
|
||||||
|
sessions = self.search([
|
||||||
|
('state', '=', 'confirmed'),
|
||||||
|
('date', '>=', now),
|
||||||
|
('date', '<=', next_day),
|
||||||
|
('reminder_sent', '=', False),
|
||||||
|
])
|
||||||
|
|
||||||
|
template = self.env.ref('academy_management.email_template_reminder', raise_if_not_found=False)
|
||||||
|
if not template:
|
||||||
|
return
|
||||||
|
|
||||||
|
for session in sessions:
|
||||||
|
if session.student_ids:
|
||||||
|
print(f'Gửi nhắc nhở lịch học: {session.name}')
|
||||||
|
template.send_mail(session.id, force_send=True)
|
||||||
|
session.reminder_sent = True
|
||||||
|
|
||||||
Reference in New Issue
Block a user