19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:12 +01:00
parent 79f83631d5
commit 73afc09215
6267 changed files with 1534193 additions and 1130106 deletions

View file

@ -2,23 +2,14 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import _
from odoo.http import request, route
from odoo.addons.portal.controllers.portal import CustomerPortal
from odoo.addons.website_event.controllers.main import WebsiteEventController
class WebsiteEventSaleController(WebsiteEventController):
@route()
def event_register(self, event, **post):
event = event.with_context(pricelist=request.website.id)
if not request.context.get('pricelist'):
pricelist = request.website.pricelist_id
if pricelist:
event = event.with_context(pricelist=pricelist.id)
return super().event_register(event, **post)
def _process_tickets_form(self, event, form_details):
""" Add price information on ticket order """
res = super()._process_tickets_form(event, form_details)
@ -31,34 +22,42 @@ class WebsiteEventSaleController(WebsiteEventController):
if not any(info.get('event_ticket_id') for info in registration_data):
return super()._create_attendees_from_registration_post(event, registration_data)
order_sudo = request.website.sale_get_order(force_create=True)
if order_sudo.state != 'draft':
request.website.sale_reset()
order_sudo = request.website.sale_get_order(force_create=True)
event_ticket_ids = [registration['event_ticket_id'] for registration in registration_data if registration.get('event_ticket_id')]
event_ticket_by_id = {
event_ticket.id: event_ticket
for event_ticket in request.env['event.event.ticket'].sudo().browse(event_ticket_ids)
}
if all(event_ticket.price == 0 for event_ticket in event_ticket_by_id.values()) and not request.cart.id:
# all chosen tickets are free AND no existing SO -> skip SO and payment process
return super()._create_attendees_from_registration_post(event, registration_data)
order_sudo = request.cart or request.website._create_cart()
tickets_data = defaultdict(int)
for data in registration_data:
event_ticket_id = data.get('event_ticket_id')
event_slot_id = data.get('event_slot_id', False)
event_ticket_id = data.get('event_ticket_id', False)
if event_ticket_id:
tickets_data[event_ticket_id] += 1
tickets_data[event_slot_id, event_ticket_id] += 1
cart_data = {}
for ticket_id, count in tickets_data.items():
ticket_sudo = request.env['event.event.ticket'].sudo().browse(ticket_id)
cart_values = order_sudo._cart_update(
for (slot_id, ticket_id), count in tickets_data.items():
ticket_sudo = event_ticket_by_id.get(ticket_id)
cart_values = order_sudo._cart_add(
product_id=ticket_sudo.product_id.id,
add_qty=count,
quantity=count,
event_ticket_id=ticket_id,
event_slot_id=slot_id,
)
cart_data[ticket_id] = cart_values['line_id']
cart_data[slot_id, ticket_id] = cart_values['line_id']
for data in registration_data:
event_ticket_id = data.get('event_ticket_id')
if event_ticket_id:
event_slot_id = data.get('event_slot_id', False)
event_ticket_id = data.get('event_ticket_id', False)
event_ticket = event_ticket_by_id.get(event_ticket_id)
if event_ticket:
data['sale_order_id'] = order_sudo.id
data['sale_order_line_id'] = cart_data[event_ticket_id]
request.session['website_sale_cart_quantity'] = order_sudo.cart_quantity
data['sale_order_line_id'] = cart_data[event_slot_id, event_ticket_id]
return super()._create_attendees_from_registration_post(event, registration_data)
@ -67,15 +66,30 @@ class WebsiteEventSaleController(WebsiteEventController):
res = super().registration_confirm(event, **post)
registrations = self._process_attendees_form(event, post)
order_sudo = request.cart
if not any(line.event_ticket_id for line in order_sudo.order_line):
# order does not contain any tickets, meaning we are confirming a free event
return res
# we have at least one registration linked to a ticket -> sale mode activate
if any(info['event_ticket_id'] for info in registrations):
order_sudo = request.website.sale_get_order()
if order_sudo.amount_total:
return request.redirect("/shop/checkout")
# free tickets -> order with amount = 0: auto-confirm, no checkout
elif order_sudo:
if order_sudo._is_anonymous_cart():
booked_by_partner, feedback_dict = CustomerPortal()._create_or_update_address(
request.env['res.partner'].sudo(),
order_sudo=order_sudo,
verify_address_values=False,
**registrations[0]
)
if not feedback_dict.get('invalid_fields'):
order_sudo._update_address(booked_by_partner.id, ['partner_id'])
request.session['sale_last_order_id'] = order_sudo.id
return request.redirect("/shop/checkout?try_skip_step=true")
else:
# Free order -> auto confirmation without checkout
order_sudo.action_confirm() # tde notsure: email sending ?
request.website.sale_reset()
request.session['sale_last_order_id'] = order_sudo.id
return request.redirect("/shop/confirmation")
return res