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.
331 lines
12 KiB
331 lines
12 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
|
|
# Author: Hafeesul Ali(<https://www.cybrosys.com>)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class MailMail(models.Model):
|
|
""" Inherited model representing an extended mail module."""
|
|
_inherit = "mail.mail"
|
|
|
|
is_starred = fields.Boolean(string="Starred Mail", default=False,
|
|
help="Flag indicating whether the mail is "
|
|
"starred.")
|
|
is_active = fields.Boolean(default=True, string="Active",
|
|
help="Flag indicating whether the mail is active.")
|
|
|
|
|
|
|
|
@api.model
|
|
def get_all_mails(self):
|
|
""" Method to load all mail.
|
|
Returns:
|
|
dict: A dictionary of all mails"""
|
|
mail_dict = {}
|
|
mails = self.sudo().search([('create_uid', '=', self.env.user.id)],
|
|
order="create_date desc")
|
|
for i in mails:
|
|
if i.email_to:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.email_to,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
elif i.recipient_ids:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.recipient_ids.name,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
return mail_dict
|
|
|
|
@api.model
|
|
def get_mail_count(self):
|
|
"""Method to get count of all mails,sent mails
|
|
,mails in outbox,starred mails and archived mails.
|
|
Returns:
|
|
dict: A dictionary of count of all mails,sent mails,mails in outbox
|
|
,starred mails and archived mails"""
|
|
all_count = self.sudo().search_count(
|
|
[('create_uid', '=', self.env.user.id)])
|
|
sent_count = self.sudo().search_count(
|
|
[('create_uid', '=', self.env.user.id), ('state', '=', 'sent')])
|
|
outbox_count = self.sudo().search_count(
|
|
[('state', '=', 'exception'),
|
|
('create_uid', '=', self.env.user.id)])
|
|
stared_count = self.sudo().search_count(
|
|
[('is_starred', '=', True), ('create_uid', '=', self.env.user.id)])
|
|
archived_count = self.sudo().search_count(
|
|
[('is_active', '=', False), ('create_uid', '=', self.env.user.id)])
|
|
mail_dict = {'all_count': all_count,
|
|
'sent_count': sent_count,
|
|
'outbox_count': outbox_count,
|
|
'starred_count': stared_count,
|
|
"archived_count": archived_count, }
|
|
return mail_dict
|
|
|
|
@api.model
|
|
def get_sent_mail(self):
|
|
"""Method to get all sent mail.
|
|
Returns:
|
|
dict: A dictionary of all sent mails"""
|
|
mail_dict = {}
|
|
mails = self.sudo().search([('state', '=', 'sent'),
|
|
('create_uid', '=', self.env.user.id)],
|
|
order="create_date desc")
|
|
for i in mails:
|
|
if i.email_to:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.email_to,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
elif i.recipient_ids:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.recipient_ids.name,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
else:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": "",
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
return mail_dict
|
|
|
|
@api.model
|
|
def get_outbox_mail(self):
|
|
"""Method to get all mails in outbox.
|
|
Return:
|
|
dict:A dictionary of all mails in outbox """
|
|
mail_dict = {}
|
|
mails = self.sudo().search(
|
|
[('state', '=', 'exception'),
|
|
('create_uid', '=', self.env.user.id)],
|
|
order="create_date desc")
|
|
for i in mails:
|
|
if i.email_to:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.email_to,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
elif i.recipient_ids:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.recipient_ids.name,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
else:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": "",
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
return mail_dict
|
|
|
|
@api.model
|
|
def get_starred_mail(self):
|
|
"""Method to fetch all starred mails.
|
|
Return:
|
|
dict:A dictionary of starred mails"""
|
|
mail_dict = {}
|
|
mails = self.sudo().search(
|
|
[('is_starred', '=', True), ('create_uid', '=', self.env.user.id)])
|
|
for i in mails:
|
|
if i.email_to:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.email_to,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
elif i.recipient_ids:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.recipient_ids.name,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
else:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": "",
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
return mail_dict
|
|
|
|
@api.model
|
|
def delete_mail(self, *args):
|
|
"""Method to unlink mail."""
|
|
self.sudo().search(
|
|
[('id', '=', *args), ('create_uid', '=', self.env.user.id), '|',
|
|
('is_active', '=', False), ('id', '=', *args),
|
|
('create_uid', '=', self.env.user.id)]).sudo().unlink()
|
|
|
|
@api.model
|
|
def open_mail(self, *args):
|
|
"""Method to open a mail and show its content.
|
|
Args:
|
|
*args(int):ID of the mail that want to open.
|
|
Returns:
|
|
text: body_html of a chosen mail. """
|
|
return self.sudo().search(
|
|
[('id', '=', *args), ('create_uid', '=', self.env.user.id), '|',
|
|
('is_active', '=', False), ('id', '=', *args),
|
|
('create_uid', '=', self.env.user.id)]).body_html
|
|
|
|
@api.model
|
|
def star_mail(self, *args):
|
|
"""Method to make a mail starred.
|
|
Args:
|
|
*args(int):ID of the mail that want to star."""
|
|
self.search([('id', '=', *args),
|
|
('create_uid', '=', self.env.user.id)]). \
|
|
write({"is_starred": True})
|
|
|
|
@api.model
|
|
def unstar_mail(self, *args):
|
|
"""Method to make a mail not starred.
|
|
Args:
|
|
*args(int):ID of the mail that want to make not starred. """
|
|
self.sudo().search([('id', '=', *args),
|
|
('create_uid', '=', self.env.user.id)]). \
|
|
write({"is_starred": False})
|
|
|
|
@api.model
|
|
def archive_mail(self, *args):
|
|
"""Method to archive mail.
|
|
Args:
|
|
*args(int):ID of the mail that want to archive. """
|
|
self.sudo().search([('id', '=', *args),
|
|
('create_uid', '=', self.env.user.id)]). \
|
|
write({"is_active": False})
|
|
|
|
@api.model
|
|
def get_archived_mail(self):
|
|
"""Method to get archived mails
|
|
Returns:
|
|
dict:A dictionary of archived mails. """
|
|
mail_dict = {}
|
|
mails = self.sudo().search([('is_active', '=', False),
|
|
('create_uid', '=', self.env.user.id)])
|
|
for i in mails:
|
|
if i.email_to:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.email_to,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
elif i.recipient_ids:
|
|
mail_dict[str(i.mail_message_id)] = ({
|
|
"id": i.id,
|
|
"sender": i.recipient_ids.name,
|
|
"subject": i.subject,
|
|
"date": fields.Date.to_date(i.create_date),
|
|
})
|
|
return mail_dict
|
|
|
|
@api.model
|
|
def unarchive_mail(self, *args):
|
|
"""Method to make mail unarchived.
|
|
Args:
|
|
*args(int):The id of the mail to be unarchived."""
|
|
self.sudo().search([('is_active', '=', False), ('id', '=', *args),
|
|
('create_uid', '=', self.env.user.id)]). \
|
|
write({'is_active': True})
|
|
|
|
@api.model
|
|
def delete_checked_mail(self, *args):
|
|
"""Method to delete checked mails.
|
|
Args:
|
|
*args(int):I'd of the mail to be deleted."""
|
|
self.search(
|
|
[('id', 'in', *args), '|', ('id', 'in', *args),
|
|
('is_active', '=', False)]).sudo().unlink()
|
|
|
|
@api.model
|
|
def archive_checked_mail(self, *args):
|
|
"""Method to archive checked mails.
|
|
Args:
|
|
*args(int):ID of the checked mails to be archived."""
|
|
self.sudo().search([('id', 'in', *args),
|
|
('create_uid', '=', self.env.user.id)]). \
|
|
write({"is_active": False})
|
|
|
|
@api.model
|
|
def sent_mail(self, *args):
|
|
"""Method to compose and send mail.
|
|
Args:
|
|
*args(dict):A dictionary of mail subject content and recipient."""
|
|
mail_from = self.env.user.email
|
|
for item in args:
|
|
subject = item.get("subject")
|
|
recipient = item.get("recipient")
|
|
content = item.get("content")
|
|
attachment_id = self.env['mail.attachment']. \
|
|
search([], order="id desc", limit=1).id
|
|
if attachment_id:
|
|
mail_attachment = self.env['ir.attachment']. \
|
|
sudo().search(
|
|
[('res_id', '=', attachment_id),
|
|
('res_field', '=', 'mail_attachment')], limit=1)
|
|
file_name = self.env['mail.attachment']. \
|
|
sudo().search([], order="id desc", limit=1)
|
|
mail_attachment.sudo().write({
|
|
"name": file_name.file_name
|
|
})
|
|
self.sudo().create({
|
|
"subject": subject,
|
|
"email_to": recipient,
|
|
"email_from": mail_from,
|
|
"body_html": content,
|
|
"attachment_ids": mail_attachment
|
|
})
|
|
self.sudo().search([], limit=1).send()
|
|
self.env['mail.attachment'].sudo().search([]).unlink()
|
|
else:
|
|
self.sudo().create({
|
|
"subject": subject,
|
|
"email_to": recipient,
|
|
"email_from": mail_from,
|
|
"body_html": content,
|
|
})
|
|
self.sudo().search([], limit=1).send()
|
|
|
|
@api.model
|
|
def retry_mail(self, *args):
|
|
"""Method to retry failed messages"""
|
|
mail = self.search([('id', '=', int(*args)),
|
|
('create_uid', '=', self.env.user.id)])
|
|
mail.mark_outgoing()
|
|
mail.send()
|
|
|