[IMP] website_event: managment of tickets for an event to defined price and max number registration
bzr revid: chm@openerp.com-20130807094734-4uwlezgr50m4lwwu
This commit is contained in:
@@ -2,35 +2,64 @@
|
||||
|
||||
from openerp.osv import osv, fields
|
||||
|
||||
# defined for access rules
|
||||
class product(osv.osv):
|
||||
_inherit = 'product.product'
|
||||
_columns = {
|
||||
'event_ticket_ids': fields.one2many('event.event.ticket', 'product_id', 'Event Tickets'),
|
||||
}
|
||||
|
||||
|
||||
class event(osv.osv):
|
||||
_inherit = 'event.event'
|
||||
|
||||
def _get_register_max(self, cr, uid, ids, field_name, arg, context=None):
|
||||
result = dict.fromkeys(ids, 0)
|
||||
for rec in self.browse(cr, uid, ids, context=context):
|
||||
result[rec.id] = sum([ep.register_max for ep in rec.event_ticket_ids])
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'website_published': fields.boolean('Available in the website'),
|
||||
'description_website': fields.html('Description for the website'),
|
||||
'event_product_ids': fields.one2many('event.event.product', "event_id", "Event"),
|
||||
'event_ticket_ids': fields.one2many('event.event.ticket', "event_id", "Event Ticket"),
|
||||
'organizer_id': fields.many2one('res.partner', "Orgonizer"),
|
||||
'phone': fields.related('orgonizer_id', 'phone', type='char', string='Phone'),
|
||||
'email': fields.related('orgonizer_id', 'email', type='char', string='Email'),
|
||||
'register_max': fields.function(_get_register_max,
|
||||
string='Maximum Registrations',
|
||||
help="The maximum registration level is equal to the sum of the maximum registration of event ticket." +
|
||||
"If you have too much registrations you are not able to confirm your event. (0 to ignore this rule )",
|
||||
type='integer', store=True)
|
||||
}
|
||||
|
||||
|
||||
class event_product(osv.osv):
|
||||
_name = 'event.event.product'
|
||||
class event_ticket(osv.osv):
|
||||
_name = 'event.event.ticket'
|
||||
|
||||
def _get_register_current(self, cr, uid, ids, field_name, arg, context=None):
|
||||
result = dict.fromkeys(ids, 0)
|
||||
for rec in self.browse(cr, uid, ids, context=context):
|
||||
result[rec.id] = sum([ep.nb_register for ep in rec.registration_ids])
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'event_id': fields.many2one('event.event', "Event", required=True),
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True, domain=[("event_type_id", "!=", False)]),
|
||||
'registration_ids': fields.one2many('event.registration', 'event_ticket_id', 'Registrations'),
|
||||
'deadline': fields.date("Sales End"),
|
||||
'event_id': fields.many2one('event.event', "Event"),
|
||||
'product_id': fields.many2one('product.product', 'Product', domain=[("event_type_id", "!=", False)]),
|
||||
'price': fields.float('Price'),
|
||||
'qty': fields.integer('Current Registrations', readonly=True),
|
||||
'max_qty': fields.integer('Maximum Registrations'),
|
||||
'register_max': fields.integer('Maximum Registrations'),
|
||||
'register_current': fields.function(_get_register_current, string='Current Registrations', type='integer', store=True),
|
||||
}
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, product_id=False, context=None):
|
||||
return {'value': {'price': self.pool.get("product.product").browse(cr, uid, product_id).list_price or 0}}
|
||||
|
||||
|
||||
class product(osv.osv):
|
||||
_inherit = 'product.product'
|
||||
class event_registration(osv.osv):
|
||||
"""Event Registration"""
|
||||
_inherit= 'event.registration'
|
||||
_columns = {
|
||||
'event_product_ids': fields.one2many('event.event.product', 'product_id', 'Linked event product'),
|
||||
'event_ticket_id': fields.many2one('event.event.ticket', 'Event Ticket'),
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_event_event_public,event.event.public,event.model_event_event,base.group_public,1,0,0,0
|
||||
access_event_event_product_public,event.event.product.public,website_event.model_event_event_product,base.group_public,1,0,0,0
|
||||
access_event_event_ticket_public,event.event.ticket.public,website_event.model_event_event_ticket,base.group_public,1,0,0,0
|
||||
access_event_product_product_public,event.product.product.public,product.model_product_product,base.group_public,1,0,0,0
|
||||
|
@@ -11,9 +11,9 @@
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_unlink" eval="False"/>
|
||||
</record>
|
||||
<record id="event_event_product_public" model="ir.rule">
|
||||
<field name="name">event product: Public</field>
|
||||
<field name="model_id" ref="website_event.model_event_event_product"/>
|
||||
<record id="event_event_ticket_public" model="ir.rule">
|
||||
<field name="name">event ticket: Public</field>
|
||||
<field name="model_id" ref="website_event.model_event_event_ticket"/>
|
||||
<field name="domain_force">[('event_id.website_published', '=', True)]</field>
|
||||
<field name="groups" eval="[(4, ref('base.group_public'))]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
<data>
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page string="Tarifs">
|
||||
<field name="product_ids">
|
||||
<field name="event_ticket_ids">
|
||||
<tree string="Payments" editable="bottom">
|
||||
<field name="product_id" on_change='onchange_product_id(product_id)'/>
|
||||
<field name="deadline"/>
|
||||
<field name="price"/>
|
||||
<field name="max_qty"/>
|
||||
<field name="register_max"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
@@ -93,9 +93,11 @@
|
||||
<ul class="media-list mt32">
|
||||
<li t-foreach="event_ids" t-as="event_id" class="media thumbnail">
|
||||
<div class="media-body">
|
||||
<t t-if="event_id.register_avail">
|
||||
<span t-if="event_id.register_avail == 9999" class="label pull-right">No ticket available.</span>
|
||||
<span t-if="event_id.register_avail != 9999" t-att-class="'label pull-right label-%%s' %% (event_id.register_avail <= 10 and 'warning' or 'info')">
|
||||
<span t-if="not event_id.event_ticket_ids" class="label pull-right">No tickets needed.</span>
|
||||
<t t-if="event_id.event_ticket_ids">
|
||||
<span t-if="event_id.register_avail == 9999" class="label pull-right label-info">Tickets availables.</span>
|
||||
<span t-if="not event_id.register_avail" class="label pull-right">No ticket available.</span>
|
||||
<span t-if="event_id.register_avail and event_id.register_avail != 9999" t-att-class="'label pull-right label-%%s' %% (event_id.register_avail <= 10 and 'warning' or 'info')">
|
||||
<t t-if="event_id.register_avail <= 10">Only</t>
|
||||
<t t-esc="event_id.register_avail"/>
|
||||
<t t-if="event_id.register_avail > 1">tickets </t>
|
||||
@@ -153,9 +155,11 @@
|
||||
</div>
|
||||
<div class="span8">
|
||||
<div class="media-body">
|
||||
<t t-if="event_id.register_avail">
|
||||
<span t-if="event_id.register_avail == 9999" class="label pull-right">No ticket available.</span>
|
||||
<span t-if="event_id.register_avail != 9999" t-att-class="'label pull-right label-%%s' %% (event_id.register_avail <= 10 and 'warning' or 'info')">
|
||||
<span t-if="not event_id.event_ticket_ids" class="label pull-right">No tickets needed.</span>
|
||||
<t t-if="event_id.event_ticket_ids">
|
||||
<span t-if="event_id.register_avail == 9999" class="label pull-right">Tickets availables.</span>
|
||||
<span t-if="not event_id.register_avail" class="label pull-right">No ticket available.</span>
|
||||
<span t-if="event_id.register_avail and event_id.register_avail != 9999" t-att-class="'label pull-right label-%%s' %% (event_id.register_avail <= 10 and 'warning' or 'info')">
|
||||
<t t-if="event_id.register_avail <= 10">Only</t>
|
||||
<t t-esc="event_id.register_avail"/>
|
||||
<t t-if="event_id.register_avail > 1">tickets </t>
|
||||
@@ -164,36 +168,40 @@
|
||||
</span>
|
||||
</t>
|
||||
<h4 class="media-heading"><a t-att-href="'/event/%%s/' %% event_id.id"><span t-field="event_id.name"> </span></a></h4>
|
||||
<a t-if="editable" href="#" t-att-data-id="event_id.id" class="pull-right">
|
||||
<span t-att-class="'label label-success js_unpublish %%s' %% (not event_id.website_published and 'hidden' or '')">Click to Unpublish</span>
|
||||
<span t-att-class="'label label-important js_publish %%s' %% (event_id.website_published and 'hidden' or '')">Click to Publish</span>
|
||||
</a>
|
||||
<h5 class="media-heading">
|
||||
<span t-field="event_id.address_id"/><br/>
|
||||
<i class="icon-time"></i> <span t-field="event_id.date_begin"/><br/>
|
||||
<i class="icon-time"></i> <span t-field="event_id.date_end"/>
|
||||
</h5>
|
||||
<a t-if="editable" href="#" t-att-data-id="event_id.id" class="pull-right">
|
||||
<span t-att-class="'label label-success js_unpublish %%s' %% (not event_id.website_published and 'hidden' or '')">Click to Unpublish</span>
|
||||
<span t-att-class="'label label-important js_publish %%s' %% (event_id.website_published and 'hidden' or '')">Click to Publish</span>
|
||||
</a>
|
||||
<h4 t-if="event_id.event_product_ids">Ticket Information</h4>
|
||||
<form t-att-action="'/event/%%s/add_cart' %% event_id.id" method="post" t-if="event_id.event_product_ids">
|
||||
<h4 t-if="event_id.event_ticket_ids">Ticket Information</h4>
|
||||
<form t-att-action="'/event/%%s/add_cart' %% event_id.id" method="post" t-if="event_id.event_ticket_ids">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>Ticket type</th>
|
||||
<th>Sales End</th>
|
||||
<th>Price</th>
|
||||
<th>Seats</th>
|
||||
<th>Quantity</th>
|
||||
</tr>
|
||||
<tr t-foreach="event_id.event_product_ids" t-as="prod">
|
||||
<td t-field="prod.product_id"/>
|
||||
<td t-field="prod.deadline"/>
|
||||
<td t-field="prod.price"/>
|
||||
<td><span t-if="prod.max_qty"><t t-esc="prod.qty"/>/<t t-field="prod.max_qty"/></span></td>
|
||||
<td>
|
||||
<select t-att-name="'product[%%s]' %% prod.id">
|
||||
<t t-foreach="range(0,10)" t-as="nb"><option t-esc="nb"/></t>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Ticket type</th>
|
||||
<th>Sales End</th>
|
||||
<th>Price</th>
|
||||
<th>Seats</th>
|
||||
<th>Quantity</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr t-foreach="event_id.event_ticket_ids" t-as="ticket">
|
||||
<td t-field="ticket.product_id"/>
|
||||
<td t-field="ticket.deadline"/>
|
||||
<td t-field="ticket.price"/>
|
||||
<td><span t-if="ticket.register_max"><t t-esc="ticket.register_current"/>/<t t-field="ticket.register_max"/></span></td>
|
||||
<td>
|
||||
<select t-att-name="'product[%%s]' %% ticket.id">
|
||||
<t t-foreach="range(0,10)" t-as="nb"><option t-esc="nb"/></t>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<button type="submit" class="btn btn-primary">Order Now</button>
|
||||
</form>
|
||||
|
||||
Reference in New Issue
Block a user