47 lines
2.2 KiB
Python
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
|