Skip to content

event: Limit max ticket per registration feature #713

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: 18.0
Choose a base branch
from
Open
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_max_ticket_per_registration/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
17 changes: 17 additions & 0 deletions event_max_ticket_per_registration/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
'name': "Event Limit Max tickets",
'version': '1.0',
'depends': ['website_event'],
'author': "Rishav Shah",
'category': 'events',
'description': """
Limit maximum number of tickets per registration
""",
'installable': True,
'application': True,
'license': 'LGPL-3',
'data': [
'views/event_event_views.xml',
'views/event_templates_page_registration.xml',
],
}
1 change: 1 addition & 0 deletions event_max_ticket_per_registration/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import event_event
23 changes: 23 additions & 0 deletions event_max_ticket_per_registration/models/event_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from odoo import api, models, fields
from odoo.exceptions import ValidationError


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

has_ticket_limitation = fields.Boolean(string="Limit Tickets per Rgistration", default=False)
ticket_max_per_registration = fields.Integer(compute='_compute_tickets_max_per_registration',
readonly=False, store=True, default=0,
help="It will select this default maximum value when you choose number of tickets in this event registration")

@api.depends('has_ticket_limitation')
def _compute_tickets_max_per_registration(self):
for record in self:
if not record.has_ticket_limitation:
record.ticket_max_per_registration = 0

@api.constrains("ticket_max_per_registration")
def _set_ticket_max_per_registration(self):
for record in self:
if record.has_ticket_limitation and record.ticket_max_per_registration == 0:
raise ValidationError("Limit Tickets should be greater than 0")
17 changes: 17 additions & 0 deletions event_max_ticket_per_registration/views/event_event_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_event_form_inherit" model="ir.ui.view">
<field name="name">event.event.form.inherit</field>
<field name="model">event.event</field>
<field name="inherit_id" ref="event.view_event_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='right_event_details']/div[field[@name='seats_limited']]" position="after">
<label for="has_ticket_limitation" string="Limit Tickets"/>
<div>
<field name="has_ticket_limitation" string="Limit Tickets"/>
<span invisible="not has_ticket_limitation" required="not has_ticket_limitation">to <field name="ticket_max_per_registration" class="oe_inline o_input_9ch"/> Tickets</span>
</div>
</xpath>
</field>
</record>
</odoo>
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?xml version="1.0"?>
<odoo>
<template id="event_tickets_limit_template" inherit_id="website_event.modal_ticket_registration">
<xpath expr="//div[hasclass('o_wevent_registration_single_select')]//select" position="replace">
<select t-att-name="'nb_register-%s' % (tickets.id if tickets else 0)" class="d-inline w-auto form-select">
<t t-if="event.ticket_max_per_registration">
<t t-set="seats_max_ticket" t-value="(not tickets or not tickets.seats_limited or tickets.seats_available &gt; event.ticket_max_per_registration) and event.ticket_max_per_registration + 1 or tickets.seats_available + 2"/>
<t t-set="seats_max_event" t-value="(not event.seats_limited or event.seats_available &gt; event.ticket_max_per_registration) and event.ticket_max_per_registration + 1 or event.seats_available + 1"/>
<t t-set="seats_max" t-value="min(seats_max_ticket, seats_max_event) if tickets else seats_max_event"/>
</t>
<t t-else="">
<t t-set="seats_max_ticket" t-value="(not tickets or not tickets.seats_limited or tickets.seats_available &gt; 9) and 10 or tickets.seats_available + 1"/>
<t t-set="seats_max_event" t-value="(not event.seats_limited or event.seats_available &gt; 9) and 10 or event.seats_available + 1"/>
<t t-set="seats_max" t-value="min(seats_max_ticket, seats_max_event) if tickets else seats_max_event"/>
</t>
<t t-foreach="range(0, seats_max)" t-as="nb">
<option t-out="nb" t-att-selected="nb == 1 and 'selected'"/>
</t>
</select>
</xpath>
<xpath expr="//div[@id='o_wevent_tickets_collapse']//select" position="replace">
<select t-if="not ticket.is_expired and ticket.sale_available" t-attf-name="nb_register-#{ticket.id}" class="w-auto form-select">
<t t-if="event.ticket_max_per_registration">
<t t-set="seats_max_ticket" t-value="(not ticket.seats_limited or ticket.seats_available &gt; event.ticket_max_per_registration) and event.ticket_max_per_registration + 1 or ticket.seats_available + 1"/>
<t t-set="seats_max_event" t-value="(not event.seats_limited or event.seats_available &gt; event.ticket_max_per_registration) and event.ticket_max_per_registration + 1 or event.seats_available + 1"/>
<t t-set="seats_max" t-value="min(seats_max_ticket, seats_max_event)"/>
</t>
<t t-else="">
<t t-set="seats_max_ticket" t-value="(not ticket.seats_limited or ticket.seats_available &gt; 9) and 10 or ticket.seats_available + 1"/>
<t t-set="seats_max_event" t-value="(not event.seats_limited or event.seats_available &gt; 9) and 10 or event.seats_available + 1"/>
<t t-set="seats_max" t-value="min(seats_max_ticket, seats_max_event)"/>
</t>
<t t-foreach="range(0, seats_max)" t-as="nb">
<option t-out="nb" t-att-selected="len(ticket) == 0 and nb == 0 and 'selected'"/>
</t>
</select>
</xpath>
</template>
</odoo>