Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions event_registration_limit/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
12 changes: 12 additions & 0 deletions event_registration_limit/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
'name': "Event Registration limit",
'category': "Marketing/Events",
'summary': "Module to Limit the Number of Tickets Per Registration",
'depends': ['event', 'website_event'],
'data': [
'views/event_event_views.xml',
'views/event_registration_views.xml'
],
'installable': True,
'license': "AGPL-3",
}
1 change: 1 addition & 0 deletions event_registration_limit/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import event_event
22 changes: 22 additions & 0 deletions event_registration_limit/models/event_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

from odoo import api, fields, models
from odoo.exceptions import ValidationError


class Event(models.Model):
_inherit = "event.event"

# Event-level limit for max tickets per registration
default_tickets_per_registration = fields.Integer(
string="Default Tickets per Registration",
help="Maximum number of tickets that can be booked in a single registration for this event.",
default=9
)

@api.constrains("default_tickets_per_registration")
def _check_ticket_limit(self):
for event in self:
if event.default_tickets_per_registration < 0:
raise ValidationError(
"Default tickets per registration must be greater than 0."
)
15 changes: 15 additions & 0 deletions event_registration_limit/views/event_event_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<odoo>
<!-- Inherit Event form to add default_tickets_per_registration -->
<record id="event_event_view_form_from_event_inherited" model="ir.ui.view">
<field name="name">event.event.view.form.from.event.inherit</field>
<field name="model">event.event</field>
<field name="inherit_id" ref="event.view_event_form"/>
<field name="arch" type="xml">
<!-- Insert after the address field -->
<xpath expr="//group[@name='right_event_details']/field[@name='address_id']" position="after">
<field name="default_tickets_per_registration"/>
</xpath>
</field>
</record>
</odoo>
50 changes: 50 additions & 0 deletions event_registration_limit/views/event_registration_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?xml version="1.0"?>
<odoo>
<data>
<template id="modal_ticket_registration" name="Modal for tickets registration" inherit_id="website_event.modal_ticket_registration">

<!-- seats_max_ticket -->
<xpath expr="//t[@t-set='seats_max_ticket']" position="replace">
<t t-set="seats_max_ticket" t-value="
min(
ticket.seats_available if ticket and ticket.seats_limited and ticket.seats_available else event.default_tickets_per_registration,
event.default_tickets_per_registration
)
"/>
</xpath>

<!-- seats_max_event -->
<xpath expr="//t[@t-set='seats_max_event']" position="replace">
<t t-set="seats_max_event" t-value="
min(
event.seats_available if event.seats_limited and event.seats_available else event.default_tickets_per_registration,
event.default_tickets_per_registration
)
"/>
</xpath>

<!-- ticket dropdown -->
<xpath expr="//div[contains(@class, 'o_wevent_registration_single_select')]" position="replace">
<div class="o_wevent_registration_single_select w-auto ms-auto">
<t t-if="event.seats_limited and event.seats_max == 0">
<div class="text-danger">No Tickets Available</div>
</t>
<t t-else="">
<select t-att-name="'nb_register-%s' % (tickets.id if tickets else 0)" class="d-inline w-auto form-select">
<t t-set="seats_max" t-value="
min(
(tickets.seats_available if tickets and tickets.seats_limited else event.default_tickets_per_registration),
event.default_tickets_per_registration
)
"/>
<t t-foreach="range(1, seats_max + 1)" t-as="nb">
<option t-out="nb" t-att-selected="nb == 1 and 'selected'"/>
</t>
</select>
</t>
</div>
</xpath>

</template>
</data>
</odoo>