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.
		
		
		
		
		
			
		
			
				
					
					
						
							163 lines
						
					
					
						
							7.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							163 lines
						
					
					
						
							7.5 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # | |
| #  Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #  Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #  Author: Anusha C (odoo@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/>. | |
| # | |
| ############################################################################### | |
| # -*- coding: utf-8 -*- | |
| import base64 | |
| import logging | |
| import pytz | |
| from datetime import timedelta | |
| from odoo import fields, models, _ | |
| from odoo.exceptions import UserError | |
| from odoo.tools import is_html_empty, html2plaintext | |
| 
 | |
| _logger = logging.getLogger(__name__) | |
| try: | |
|     import vobject | |
| except ImportError: | |
|     _logger.warning( | |
|         "`vobject` Python module not found, iCal file generation disabled. " | |
|         "Consider installing this module if you want to generate iCal files") | |
|     vobject = None | |
| 
 | |
| 
 | |
| class Meeting(models.Model): | |
|     """This class is to inherit calendar event model redefine mail button | |
|     function and adding an extra button action.""" | |
|     _inherit = 'calendar.event' | |
| 
 | |
|     def action_send_ics(self): | |
|         """This function is for sending mail invitations to attendees with | |
|         attached ics file of that event.""" | |
|         print(self._get_ics_file().get(self.id)) | |
|         attachment_values = {'name': 'Event.ics', | |
|                              'type': 'binary', | |
|                              'datas': base64.b64encode( | |
|                                  self._get_ics_file().get(self.id)), | |
|                              'mimetype': 'text/calendar', | |
|                              'res_model': 'calendar.event', | |
|                              'res_id': self.id} | |
|         attachment = self.env['ir.attachment'].sudo().create(attachment_values) | |
|         email_template = self.env.ref('odoo_icalendar.event_ics_email_template') | |
|         email_values = {'email_to': ', '.join( | |
|             attendee.email for attendee in self.partner_ids), | |
|             'attachment_ids': [(4, attachment.id)]} | |
|         email_template.send_mail( | |
|             self.id, email_values=email_values, force_send=True) | |
|         email_template.attachment_ids = [(5, 0, 0)] | |
| 
 | |
|     def action_send_attendee_ics_file(self): | |
|         """Button action to send an ics file attached to mail of the | |
|         attendees.""" | |
|         result = {} | |
| 
 | |
|         def ics_datetime(idate, allday=False): | |
|             """Format a date and time as an iCalendar-compatible string. | |
|                :param idate: The input date and time. | |
|                :type idate: datetime.datetime | |
|                :param allday: Flag indicating if the event is an all-day event | |
|                (default is False). | |
|                :type allday: bool | |
|                :return: The formatted date and time as a string in the iCalendar | |
|                 format. | |
|                :rtype: str or False if idate is None.""" | |
|             if idate: | |
|                 if allday: | |
|                     return idate | |
|                 return idate.replace(tzinfo=pytz.timezone('UTC')) | |
|             return False | |
| 
 | |
|         if not vobject: | |
|             return result | |
|         attendee_events = {} | |
|         meeting_obj = [] | |
|         for meeting in self: | |
|             meeting_obj = meeting | |
|             for attendee in meeting.partner_ids: | |
|                 if attendee.id not in attendee_events: | |
|                     attendee_events[attendee.id] = vobject.iCalendar() | |
|                 cal = attendee_events[attendee.id] | |
|                 event = cal.add('vevent') | |
|                 if not meeting.start or not meeting.stop: | |
|                     raise UserError( | |
|                         _("First you have to specify the date of the " | |
|                           "invitation.")) | |
|                 event.add('created').value = ics_datetime(fields.Datetime.now()) | |
|                 event.add('dtstart').value = ics_datetime(meeting.start, | |
|                                                           meeting.allday) | |
|                 event.add('dtend').value = ics_datetime(meeting.stop, | |
|                                                         meeting.allday) | |
|                 event.add('summary').value = meeting.name | |
|                 if not is_html_empty(meeting.description): | |
|                     if 'appointment_type_id' in meeting._fields and \ | |
|                             self.appointment_type_id: | |
|                         event.add( | |
|                             'description').value = self. \ | |
|                             convert_online_event_desc_to_text( | |
|                             meeting.description) | |
|                     else: | |
|                         event.add('description').value = html2plaintext( | |
|                             meeting.description) | |
|                 if meeting.location: | |
|                     event.add('location').value = meeting.location | |
|                 if meeting.rrule: | |
|                     event.add('rrule').value = meeting.rrule | |
|                 if meeting.alarm_ids: | |
|                     for alarm in meeting.alarm_ids: | |
|                         valarm = event.add('valarm') | |
|                         interval = alarm.interval | |
|                         duration = alarm.duration | |
|                         trigger = valarm.add('TRIGGER') | |
|                         trigger.params['related'] = ["START"] | |
|                         delta = '' | |
|                         if interval == 'days': | |
|                             delta = timedelta(days=duration) | |
|                         elif interval == 'hours': | |
|                             delta = timedelta(hours=duration) | |
|                         elif interval == 'minutes': | |
|                             delta = timedelta(minutes=duration) | |
|                         trigger.value = delta | |
|                         valarm.add('DESCRIPTION').value = alarm.name or 'Odoo' | |
|                 attendee_add = event.add('attendee') | |
|                 attendee_add.value = 'MAILTO:' + (attendee.email or '') | |
|         for attendee_id, cal in attendee_events.items(): | |
|             attendee = self.env['res.partner'].browse(attendee_id) | |
|             attachment_values = {'name': 'All_Events.ics', | |
|                                  'type': 'binary', | |
|                                  'datas': base64.b64encode( | |
|                                      cal.serialize().encode('utf-8')), | |
|                                  'mimetype': 'text/calendar', | |
|                                  'res_model': 'calendar.event', | |
|                                  'res_id': attendee.id} | |
|             attachment = self.env['ir.attachment'].sudo().create( | |
|                 attachment_values) | |
|             email_template = self.env.ref( | |
|                 'odoo_icalendar.odoo_icalendar_email_template') | |
|             email_values = {'email_to': attendee.email, | |
|                             'email_cc': False, | |
|                             'scheduled_date': False, | |
|                             'recipient_ids': [], | |
|                             'partner_ids': [], | |
|                             'auto_delete': True, | |
|                             'attachment_ids': [(4, attachment.id)]} | |
|             email_template.send_mail(meeting_obj[0].id, | |
|                                      email_values=email_values, | |
|                                      force_send=True) | |
|             email_template.attachment_ids = [(5, 0, 0)]
 | |
| 
 |