[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:
Christophe Matthieu
2013-08-07 11:47:34 +02:00
parent 49ce8ee1b6
commit 64ec795203
4 changed files with 83 additions and 46 deletions
+39 -10
View File
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_event_public event.event.public event.model_event_event base.group_public 1 0 0 0
3 access_event_event_product_public access_event_event_ticket_public event.event.product.public event.event.ticket.public website_event.model_event_event_product website_event.model_event_event_ticket base.group_public 1 0 0 0
4 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"/>
+40 -32
View File
@@ -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 &lt;= 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 &lt;= 10 and 'warning' or 'info')">
<t t-if="event_id.register_avail &lt;= 10">Only</t>
<t t-esc="event_id.register_avail"/>
<t t-if="event_id.register_avail &gt; 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 &lt;= 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 &lt;= 10 and 'warning' or 'info')">
<t t-if="event_id.register_avail &lt;= 10">Only</t>
<t t-esc="event_id.register_avail"/>
<t t-if="event_id.register_avail &gt; 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>