Split FSM into separate modules and switch customer to address book
This commit is contained in:
125
odoo/addons/dsrpt_address_book/models/contact_event.py
Normal file
125
odoo/addons/dsrpt_address_book/models/contact_event.py
Normal file
@@ -0,0 +1,125 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from datetime import timedelta
|
||||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class ContactEvent(models.Model):
|
||||
_name = 'contact.event'
|
||||
_description = 'Contact Event'
|
||||
_order = 'date_start desc'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
|
||||
contact_id = fields.Many2one(
|
||||
'dsrpt.contact',
|
||||
string='Contact',
|
||||
required=True,
|
||||
ondelete='cascade',
|
||||
tracking=True
|
||||
)
|
||||
date_start = fields.Datetime(
|
||||
string='Date & Time',
|
||||
required=True,
|
||||
default=fields.Datetime.now,
|
||||
tracking=True
|
||||
)
|
||||
duration = fields.Float(
|
||||
string='Duration (hours)',
|
||||
default=1.0,
|
||||
tracking=True
|
||||
)
|
||||
user_id = fields.Many2one(
|
||||
'res.users',
|
||||
string='Responsible',
|
||||
default=lambda self: self.env.user,
|
||||
tracking=True
|
||||
)
|
||||
calendar_event_id = fields.Many2one(
|
||||
'calendar.event',
|
||||
string='Calendar Event',
|
||||
readonly=True
|
||||
)
|
||||
notes = fields.Text(string='Notes', required=True, tracking=True)
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
records = super().create(vals_list)
|
||||
for record in records:
|
||||
# Get base URL for creating contact link
|
||||
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url', 'http://localhost:8069')
|
||||
contact_url = f"{base_url}/web#id={record.contact_id.id}&model=dsrpt.contact&view_type=form"
|
||||
|
||||
# Prepare description with contact link
|
||||
description = f"📱 Contact in Odoo: {contact_url}\n\n"
|
||||
if record.notes:
|
||||
description += record.notes
|
||||
|
||||
calendar_event = self.env['calendar.event'].create({
|
||||
'name': f"[{record.contact_id.name}] {record.notes[:50] if record.notes else 'Event'}",
|
||||
'start': record.date_start,
|
||||
'stop': record.date_start + timedelta(hours=record.duration),
|
||||
'user_id': record.user_id.id,
|
||||
'partner_ids': [(6, 0, [record.user_id.partner_id.id])] if record.user_id and record.user_id.partner_id else [],
|
||||
'description': description,
|
||||
})
|
||||
record.calendar_event_id = calendar_event.id
|
||||
|
||||
# Update next_contact for affected contacts with the event date
|
||||
for record in records:
|
||||
record.contact_id._update_next_contact(record.date_start)
|
||||
|
||||
return records
|
||||
|
||||
def write(self, vals):
|
||||
result = super().write(vals)
|
||||
|
||||
# Update calendar event if needed
|
||||
for record in self:
|
||||
if record.calendar_event_id:
|
||||
update_vals = {}
|
||||
if 'notes' in vals or 'contact_id' in vals:
|
||||
update_vals['name'] = f"[{record.contact_id.name}] {record.notes[:50] if record.notes else 'Event'}"
|
||||
if 'date_start' in vals:
|
||||
update_vals['start'] = record.date_start
|
||||
update_vals['stop'] = record.date_start + timedelta(hours=record.duration)
|
||||
if 'duration' in vals:
|
||||
update_vals['stop'] = record.date_start + timedelta(hours=record.duration)
|
||||
if 'user_id' in vals:
|
||||
update_vals['user_id'] = record.user_id.id
|
||||
update_vals['partner_ids'] = [(6, 0, [record.user_id.partner_id.id])] if record.user_id and record.user_id.partner_id else []
|
||||
if 'notes' in vals or 'contact_id' in vals:
|
||||
# Get base URL for creating contact link
|
||||
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url', 'http://localhost:8069')
|
||||
contact_url = f"{base_url}/web#id={record.contact_id.id}&model=dsrpt.contact&view_type=form"
|
||||
|
||||
# Prepare description with contact link
|
||||
description = f"📱 Contact in Odoo: {contact_url}\n\n"
|
||||
if record.notes:
|
||||
description += record.notes
|
||||
update_vals['description'] = description
|
||||
|
||||
if update_vals:
|
||||
record.calendar_event_id.write(update_vals)
|
||||
|
||||
# Update next_contact for affected contacts if relevant fields changed
|
||||
if any(field in vals for field in ['date_start', 'contact_id']):
|
||||
for record in self:
|
||||
record.contact_id._update_next_contact(record.date_start)
|
||||
|
||||
return result
|
||||
|
||||
@api.ondelete(at_uninstall=False)
|
||||
def _unlink_calendar_events(self):
|
||||
for record in self:
|
||||
if record.calendar_event_id:
|
||||
record.calendar_event_id.unlink()
|
||||
|
||||
def unlink(self):
|
||||
# Store contacts before deletion for clearing next_contact
|
||||
contacts = self.mapped('contact_id')
|
||||
result = super().unlink()
|
||||
# Clear next_contact for affected contacts after deletion
|
||||
for contact in contacts:
|
||||
contact._update_next_contact(None)
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user