Odoo18-Base/addons/event_sale/wizard/event_configurator.py
2025-01-06 10:57:38 +07:00

47 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, models, fields
from odoo.exceptions import ValidationError
class EventConfigurator(models.TransientModel):
_name = 'event.event.configurator'
_description = 'Event Configurator'
product_id = fields.Many2one('product.product', string="Product", readonly=True)
event_id = fields.Many2one('event.event', string="Event")
event_ticket_id = fields.Many2one('event.event.ticket', string="Ticket Type",
compute="_compute_event_ticket_id", readonly=False, store=True)
has_available_tickets = fields.Boolean("Has Available Tickets", compute="_compute_has_available_tickets")
@api.constrains('event_id', 'event_ticket_id')
def check_event_id(self):
error_messages = []
for record in self:
if record.event_id.id != record.event_ticket_id.event_id.id:
error_messages.append(
_('Invalid ticket choice "%(ticket_name)s" for event "%(event_name)s".'))
if error_messages:
raise ValidationError('\n'.join(error_messages))
@api.depends('product_id')
def _compute_has_available_tickets(self):
product_ticket_data = self.env['event.event.ticket']._read_group([
('product_id', 'in', self.product_id.ids),
('event_id.date_end', '>=', fields.Date.today())],
['product_id'],
['__count'])
mapped_data = {product: ticket_count for product, ticket_count in product_ticket_data}
for configurator in self:
configurator.has_available_tickets = bool(mapped_data.get(configurator.product_id, 0))
@api.depends('event_id')
def _compute_event_ticket_id(self):
""" Pre-select the ticket of the event selected if it is the only one """
for configurator in self:
event_ticket_ids = self.env['event.event.ticket'].search([
('event_id', '=', configurator.event_id.id),
('product_id', '=', configurator.product_id.id)], limit=2)
configurator.event_ticket_id = event_ticket_ids if len(event_ticket_ids) == 1 else False