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.
		
		
		
		
		
			
		
			
				
					
					
						
							180 lines
						
					
					
						
							7.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							180 lines
						
					
					
						
							7.7 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ################################################################################### | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #     Author:Anjhana A K(<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/>. | |
| # | |
| ############################################################################# | |
| from collections import defaultdict | |
| from odoo import fields, models, _ | |
| from odoo.exceptions import UserError | |
| 
 | |
| 
 | |
| class MailActivity(models.Model): | |
|     """This class is used to inherit the mail.activity model""" | |
|     _inherit = "mail.activity" | |
| 
 | |
|     state = fields.Selection( | |
|         [ | |
|             ("overdue", "Overdue"), ("today", "Today"), ("planned", "Planned"), | |
|             ("done", "Done"), ("cancel", "Cancelled"),], | |
|         "State", compute="_compute_state", store=True, | |
|         help="state for the activity",) | |
|     active = fields.Boolean("Active", default=True, | |
|                             help="The record make Active") | |
|     activity_type = fields.Many2many( | |
|         "activity.tag", string="Activity Type", | |
|         help="Activity type") | |
| 
 | |
|     def action_mail_on_due_date(self): | |
|         """This function is used to send mails on due date""" | |
|         activity_email = self.env["mail.activity"].search([]) | |
|         notification_on_date = ( | |
|             self.env["ir.config_parameter"].sudo().get_param("notify_on_due_date") | |
|         ) | |
|         notification_on_expiry = ( | |
|             self.env["ir.config_parameter"].sudo().get_param("notify_on_expiry") | |
|         ) | |
|         for rec in activity_email: | |
|             if notification_on_expiry: | |
|                 if rec.date_deadline < fields.date.today(): | |
|                     self.env["mail.mail"].sudo().create( | |
|                         { | |
|                             "email_from": self.env.company.email, | |
|                             "author_id": self.env.user.partner_id.id, | |
|                             "body_html": "Hello <br> You missed the %s activity for the document %s </br>" | |
|                             % (rec.activity_type_id.name, rec.res_name), | |
|                             "subject": "%s Activity missed" % rec.activity_type_id.name, | |
|                             "email_to": rec.user_id.email, | |
|                         } | |
|                     ).send(auto_commit=False) | |
|             if notification_on_date: | |
|                 if rec.date_deadline == fields.date.today(): | |
|                     self.env["mail.mail"].sudo().create( | |
|                         { | |
|                             "email_from": self.env.company.email, | |
|                             "author_id": self.env.user.partner_id.id, | |
|                             "body_html": "Hello <br> Today is your %s activity for the document %s </br>" | |
|                             % (rec.activity_type_id.name, rec.res_name), | |
|                             "subject": "Today %s Activity" % rec.activity_type_id.name, | |
|                             "email_to": rec.user_id.email, | |
|                         } | |
|                     ).send(auto_commit=False) | |
| 
 | |
|     def action_activity_cancel(self): | |
|         """cancel activity""" | |
|         for rec in self: | |
|             if rec.state == "cancel": | |
|                 raise UserError(_("You Cant Cancelled this activity %s") % rec.res_name) | |
|             else: | |
|                 rec.action_cancel() | |
| 
 | |
|     def action_activity_done(self): | |
|         """done activity""" | |
|         for rec in self: | |
|             if rec.state == "done": | |
|                 raise UserError(_("You Cant Cancelled this activity %s") % rec.res_name) | |
|             else: | |
|                 rec._action_done() | |
| 
 | |
|     def get_activity_count(self): | |
|         """get the activity count details""" | |
|         activity = self.env["mail.activity"] | |
|         all_activity = activity.search([]) | |
|         planned = activity.search([("state", "=", "planned")]) | |
|         overdue = activity.search([("state", "=", "overdue")]) | |
|         today = activity.search([("state", "=", "today")]) | |
|         done = activity.search([("state", "=", "done"), ("active", "=", False)]) | |
|         cancel = activity.search([("state", "=", "cancel")]) | |
|         return { | |
|             "len_all": len(all_activity), | |
|             "len_overdue": len(overdue), | |
|             "len_planned": len(planned), | |
|             "len_today": len(today), | |
|             "len_done": len(done), | |
|             "len_cancel": len(cancel), | |
|         } | |
| 
 | |
|     def get_activity(self, id): | |
|         """Function for to get the activity""" | |
|         activity = self.env["mail.activity"].search([("id", "=", id)]) | |
|         return {"model": activity.res_model, "res_id": activity.res_id} | |
| 
 | |
|     def _action_done(self, feedback=False, attachment_ids=None): | |
|         """action done function: rewrite the function""" | |
|         messages = self.env["mail.message"] | |
|         next_activities_values = [] | |
|         attachments = self.env["ir.attachment"].search_read( | |
|             [("res_model", "=", self._name), ("res_id", "in", self.ids)], | |
|             ["id", "res_id"]) | |
|         activity_attachments = defaultdict(list) | |
|         for attachment in attachments: | |
|             activity_id = attachment["res_id"] | |
|             activity_attachments[activity_id].append(attachment["id"]) | |
|         for activity in self: | |
|             if activity.chaining_type == "trigger": | |
|                 vals = activity.with_context( | |
|                     activity_previous_deadline=activity.date_deadline | |
|                 )._prepare_next_activity_values() | |
|                 next_activities_values.append(vals) | |
|             # post message on activity, before deleting it | |
|             records_sudo = self.env[activity.res_model].browse(activity.res_id) | |
|             records_sudo.message_post_with_source( | |
|                 "mail.message_activity_done", | |
|                 attachment_ids=attachment_ids, | |
|                 author_id=self.env.user.partner_id.id, | |
|                 render_values={ | |
|                     "activity": activity, | |
|                     "feedback": feedback, | |
|                     "display_assignee": activity.user_id != self.env.user, | |
|                 }, | |
|                 mail_activity_type_id=activity.activity_type_id.id, | |
|                 subtype_xmlid='mail.mt_activities', | |
|             ) | |
|             if activity.activity_type_id.keep_done: | |
|                 attachment_ids = ( | |
|                                              attachment_ids or []) + activity_attachments.get( | |
|                     activity.id, []) | |
|                 if attachment_ids: | |
|                     activity.attachment_ids = attachment_ids | |
|             activity_message = records_sudo.message_ids[0] | |
|             message_attachments = self.env["ir.attachment"].browse( | |
|                 activity_attachments[activity.id] | |
|             ) | |
|             if message_attachments: | |
|                 message_attachments.write( | |
|                     { | |
|                         "res_id": activity_message.id, | |
|                         "res_model": activity_message._name, | |
|                     } | |
|                 ) | |
|                 activity_message.attachment_ids = message_attachments | |
|             messages += activity_message | |
| 
 | |
|         next_activities = self.env['mail.activity'] | |
|         if next_activities_values: | |
|             next_activities = self.env['mail.activity'].create( | |
|                 next_activities_values) | |
|         for rec in self: | |
|             rec.state = "done" | |
|             rec.active = False | |
|         return messages, next_activities | |
| 
 | |
|     def action_cancel(self): | |
|         """cancel activities""" | |
|         for rec in self: | |
|             rec.state = "cancel"
 | |
| 
 |