You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
5.8 KiB
132 lines
5.8 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
|
|
#
|
|
# You can modify it under the terms of the GNU LESSER
|
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
|
|
# (LGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
import datetime
|
|
import pytz
|
|
from odoo import api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class MailComposeMessage(models.TransientModel):
|
|
"""This class add a field called schedule_time in this model, to have the
|
|
date and time for scheduling """
|
|
_inherit = 'mail.compose.message'
|
|
|
|
schedule_time = fields.Datetime(string='Schedule Time',
|
|
help='Schedule date and time')
|
|
|
|
@api.onchange('schedule_time')
|
|
def _onchange_schedule_time(self):
|
|
"""When the field 'schedule_time' change, it will replace the seconds
|
|
as zero"""
|
|
if self.schedule_time:
|
|
self.schedule_time = self.schedule_time.replace(second=0)
|
|
|
|
def action_schedule_mail(self):
|
|
"""This function is used to create a record in schedule.mail and
|
|
display the scheduled mail as a message in chatter """
|
|
|
|
email_from = self.author_id.email
|
|
attachment_list = []
|
|
for attachment in self.attachment_ids:
|
|
attachment_list.append(attachment.id)
|
|
partner_list = []
|
|
for partner in self.partner_ids:
|
|
partner_list.append(partner.id)
|
|
schedule_mail = self.env['mail.mail'].create({
|
|
'email_from': email_from,
|
|
'subject': self.subject,
|
|
'body_html': self.body,
|
|
'scheduled_date': self.schedule_time,
|
|
'recipient_ids': partner_list,
|
|
'attachment_ids': attachment_list,
|
|
'reply_to': email_from
|
|
})
|
|
utc_current_datetime = fields.Datetime.now()
|
|
user_tz = pytz.timezone(self.env.context.get(
|
|
'tz') or self.env.user.tz) # Access the time zone
|
|
date_today = pytz.utc.localize(utc_current_datetime).astimezone(
|
|
user_tz) # Access local time
|
|
user_current_datetime = date_today.strftime(
|
|
'%Y-%m-%d %H:%M:%S') # Converted to string and removed the utc time difference
|
|
user_current_date = datetime.datetime.strptime(user_current_datetime,
|
|
"%Y-%m-%d %H:%M:%S").replace(
|
|
second=0)
|
|
if not self.schedule_time:
|
|
raise UserError('Invalid Schedule time')
|
|
date_scheduled = pytz.utc.localize(utc_current_datetime).astimezone(
|
|
user_tz)
|
|
user_schedule_datetime = date_scheduled.strftime(
|
|
'%Y-%m-%d %H:%M:%S') # Converted to string and removed the utc time difference
|
|
user_schedule_datetime = datetime.datetime.strptime(user_schedule_datetime,
|
|
"%Y-%m-%d %H:%M:%S").replace(
|
|
second=0)
|
|
if self.schedule_time and user_schedule_datetime < user_current_date:
|
|
raise UserError('Invalid Schedule time')
|
|
if self.env.context.get('default_model'):
|
|
model = self.env.context['default_model']
|
|
else:
|
|
self.env.context.get('default_res_model')
|
|
model = self.env.context['default_res_model']
|
|
model_id = self.env['ir.model'].search([('model', '=', model)], limit=1)
|
|
record_id = self.env.context['default_res_id']
|
|
record = self.env[model].browse(record_id)
|
|
activity = {
|
|
'activity_type_id': self.env.ref(
|
|
'schedule_mail_to_send.mail_activity_schedule').id,
|
|
'summary': self.subject,
|
|
'note': self.body,
|
|
'date_deadline': user_schedule_datetime,
|
|
'res_model_id': model_id.id,
|
|
'res_id': record.id,
|
|
'schedule_mail_id': schedule_mail.id
|
|
}
|
|
record.activity_schedule(**activity)
|
|
return {'type': 'ir.actions.client', 'tag': 'reload'}
|
|
|
|
def send_scheduled_mail(self):
|
|
"""This function is called by a scheduled action in each minute to
|
|
send the scheduled mails"""
|
|
utc_current_datetime = fields.Datetime.now()
|
|
# Access the time zone
|
|
user_tz = pytz.timezone(self.env.context.get(
|
|
'tz') or self.env.user.tz)
|
|
# Access local time
|
|
date_today = pytz.utc.localize(utc_current_datetime).astimezone(
|
|
user_tz)
|
|
# Converted to string and removed the utc time difference
|
|
user_current_datetime = date_today.strftime(
|
|
'%Y-%m-%d %H:%M:%S')
|
|
# Again converted to datetime type and replace the seconds with 0
|
|
user_current_date = datetime.datetime.strptime(
|
|
user_current_datetime,
|
|
"%Y-%m-%d %H:%M:%S").replace(
|
|
second=0)
|
|
scheduled_mail_rec = self.env['mail.mail'].search(
|
|
[('scheduled_date', '<=', user_current_date)])
|
|
if scheduled_mail_rec:
|
|
for record in scheduled_mail_rec:
|
|
record.send()
|
|
planned_activity = self.env['mail.activity'].search(
|
|
[('schedule_mail_id', '=', record.id)])
|
|
# unlink the planned activity
|
|
planned_activity.sudo().action_feedback(self)
|
|
record.sudo().unlink() # Deleting the mail after sending
|
|
|