diff --git a/addons/event/models/event_event.py b/addons/event/models/event_event.py index ebef7dca4aa..496db204dc8 100644 --- a/addons/event/models/event_event.py +++ b/addons/event/models/event_event.py @@ -232,7 +232,7 @@ class EventEvent(models.Model): self._cr.execute(query, (tuple(self.ids),)) res = self._cr.fetchall() for event_id, state, num in res: - results[event_id][state_field[state]] += num + results[event_id][state_field[state]] = num # compute seats_available for event in self: diff --git a/addons/event/models/event_ticket.py b/addons/event/models/event_ticket.py index 73a1da8f120..b4852a1e56f 100644 --- a/addons/event/models/event_ticket.py +++ b/addons/event/models/event_ticket.py @@ -98,6 +98,7 @@ class EventTicket(models.Model): for ticket in self: ticket.seats_unconfirmed = ticket.seats_reserved = ticket.seats_used = ticket.seats_available = 0 # aggregate registrations by ticket and by state + results = {} if self.ids: state_field = { 'draft': 'seats_unconfirmed', @@ -112,10 +113,11 @@ class EventTicket(models.Model): self.env['event.registration'].flush(['event_id', 'event_ticket_id', 'state']) self.env.cr.execute(query, (tuple(self.ids),)) for event_ticket_id, state, num in self.env.cr.fetchall(): - ticket = self.browse(event_ticket_id) - ticket[state_field[state]] += num + results.setdefault(event_ticket_id, {})[state_field[state]] = num + # compute seats_available for ticket in self: + ticket.update(results.get(ticket._origin.id or ticket.id, {})) if ticket.seats_max > 0: ticket.seats_available = ticket.seats_max - (ticket.seats_reserved + ticket.seats_used) diff --git a/addons/event_sale/tests/__init__.py b/addons/event_sale/tests/__init__.py index 47f238b93ad..0bb327b8598 100644 --- a/addons/event_sale/tests/__init__.py +++ b/addons/event_sale/tests/__init__.py @@ -4,3 +4,4 @@ from . import test_event_internals from . import test_event_sale from . import test_event_sale_ui +from . import test_event_specific diff --git a/addons/event_sale/tests/test_event_specific.py b/addons/event_sale/tests/test_event_specific.py new file mode 100644 index 00000000000..12c678519bb --- /dev/null +++ b/addons/event_sale/tests/test_event_specific.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import datetime + +from dateutil.relativedelta import relativedelta + +from odoo.addons.event_sale.tests.common import TestEventSaleCommon +from odoo.tests.common import Form + + +class TestEventSpecific(TestEventSaleCommon): + + def test_event_change_max_seat_no_side_effect(self): + """ + Test that changing the Maximum (seats_max), the seats_reserved of all the ticket do not change + """ + # Enable "sell tickets with sales orders" so that we have a price column on the tickets + # Event template + with Form(self.env['event.type']) as event_type_form: + event_type_form.name = "Pastafarian Event Template" + # Edit the default line + with event_type_form.event_type_ticket_ids.new() as ticket_line: + ticket_line.name = 'Pastafarian Registration' + ticket_line.price = 0 + event_type = event_type_form.save() + + with Form(self.env['event.event']) as event_event_form: + event_event_form.name = 'Annual Pastafarian Reunion (APR)' + event_event_form.date_begin = datetime.datetime.now() + relativedelta(days=2) + event_event_form.date_end = datetime.datetime.now() + relativedelta(days=3) + event_event_form.event_type_id = event_type # Set the template + event_event_form.auto_confirm = True + # Create second ticket (VIP) + with event_event_form.event_ticket_ids.new() as ticket_line: + ticket_line.name = 'VIP (Very Important Pastafarian)' + ticket_line.price = 10 + event_event = event_event_form.save() + + # Add two registrations for the event, one registration for each ticket type + for ticket in event_event.event_ticket_ids: + self.env['event.registration'].create({ + 'event_id': event_event.id, + 'event_ticket_id': ticket.id + }) + + # Edit the maximum + before_confirmed = [t.seats_reserved for t in event_event.event_ticket_ids] + with Form(event_event) as event_event_form: + with event_event_form.event_ticket_ids.edit(0) as ticket_line: + ticket_line.seats_max = ticket_line.seats_max + 1 + after_confirmed = [t.seats_reserved for t in event_event.event_ticket_ids] + self.assertEqual(before_confirmed, after_confirmed)