summaryrefslogtreecommitdiff
path: root/addons/website_event
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@openerp.com>2013-09-06 10:35:00 +0200
committerChristophe Matthieu <chm@openerp.com>2013-09-06 10:35:00 +0200
commit8a3f1742e0e9c7acaae726e5c7106d2d7df7e970 (patch)
tree78ae5d981fcd25677caea5c8b3999b1e77bf4547 /addons/website_event
parent6f6c59ec1de1881a70e4bf728ea5d8b56bd609f9 (diff)
parentc80cf7d0646463b290137c26fbada568a6942b00 (diff)
[MERGE] from website-al
bzr revid: chm@openerp.com-20130906083500-4n5knaxiqt4cg2ht
Diffstat (limited to 'addons/website_event')
-rw-r--r--addons/website_event/__openerp__.py5
-rw-r--r--addons/website_event/controllers/main.py71
-rw-r--r--addons/website_event/event.py23
-rw-r--r--addons/website_event/event_data.xml16
-rw-r--r--addons/website_event/event_demo.xml55
-rw-r--r--addons/website_event/views/website_event.xml185
6 files changed, 256 insertions, 99 deletions
diff --git a/addons/website_event/__openerp__.py b/addons/website_event/__openerp__.py
index 41292ed1795..9a697d6f7c4 100644
--- a/addons/website_event/__openerp__.py
+++ b/addons/website_event/__openerp__.py
@@ -1,7 +1,7 @@
{
'name': 'Online Events',
'category': 'Website',
- 'summary': 'Schedule, Promote and Sell Events Online',
+ 'summary': 'Schedule, Promote and Sell Events',
'version': '1.0',
'description': """
OpenERP Blog
@@ -11,10 +11,13 @@ OpenERP Blog
'author': 'OpenERP SA',
'depends': ['website', 'event_sale', 'website_sale'],
'data': [
+ 'event_data.xml',
'views/website_event.xml',
'security/ir.model.access.csv',
'security/website_event.xml',
+ 'event_demo.xml',
],
'qweb': ['static/src/xml/*.xml'],
+ 'demo': [],
'installable': True,
}
diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py
index 8f681b6cbcd..984b4d125cd 100644
--- a/addons/website_event/controllers/main.py
+++ b/addons/website_event/controllers/main.py
@@ -4,6 +4,8 @@ from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.tools.translate import _
+from openerp.addons import website_sale
+from openerp.addons.website import website
from datetime import datetime
from dateutil.relativedelta import relativedelta
@@ -14,7 +16,7 @@ import werkzeug
class website_event(http.Controller):
- @http.route(['/event/', '/event/page/<int:page>/'], type='http', auth="public")
+ @website.route(['/event/', '/event/page/<int:page>/'], type='http', auth="public")
def events(self, page=1, **searches):
website = request.registry['website']
event_obj = request.registry['event.event']
@@ -85,7 +87,7 @@ class website_event(http.Controller):
pager = website.pager(url="/event/", total=event_count, page=page, step=step, scope=5)
obj_ids = event_obj.search(request.cr, request.uid, dom_without("none"), limit=step, offset=pager['offset'], order="date_begin DESC")
- values = website.get_rendering_context({
+ values = {
'event_ids': event_obj.browse(request.cr, request.uid, obj_ids),
'dates': dates,
'types': types,
@@ -93,26 +95,31 @@ class website_event(http.Controller):
'pager': pager,
'searches': searches,
'search_path': "?%s" % urllib.urlencode(searches),
- })
+ }
- return website.render("website_event.index", values)
+ return request.webcontext.render("website_event.index", values)
- @http.route(['/event/<int:event_id>'], type='http', auth="public")
+ @website.route(['/event/<int:event_id>'], type='http', auth="public")
def event(self, event_id=None, **post):
- website = request.registry['website']
- event = request.registry['event.event'].browse(request.cr, request.uid, event_id, {'show_address': 1})
- values = website.get_rendering_context({
- 'event_id': event,
- })
- return website.render("website_event.detail", values)
-
- @http.route(['/event/<int:event_id>/add_cart'], type='http', auth="public")
+ values = {
+ 'event_id': request.registry['event.event'].browse(request.cr, request.uid, event_id, {'show_address': 1}),
+ 'message_ids': request.registry['event.event'].browse(request.cr, request.uid, event_id).message_ids,
+ 'subscribe': post.get('subscribe'),
+ 'range': range
+ }
+ return request.webcontext.render("website_event.detail", values)
+
+ @website.route(['/event/<int:event_id>/add_cart'], type='http', auth="public")
def add_cart(self, event_id=None, **post):
+ user_obj = request.registry['res.users']
order_line_obj = request.registry.get('sale.order.line')
ticket_obj = request.registry.get('event.event.ticket')
- order = request.registry['website'].get_rendering_context()['order']
- partner_id = request.registry.get('res.users').browse(request.cr, SUPERUSER_ID, request.uid).partner_id.id
+ order = request.webcontext['order']
+ if not order:
+ order = website_sale.controllers.main.get_order()
+
+ partner_id = user_obj.browse(request.cr, SUPERUSER_ID, request.uid).partner_id.id
context = {}
@@ -148,3 +155,37 @@ class website_event(http.Controller):
if not _values:
return werkzeug.utils.redirect("/event/%s/" % event_id)
return werkzeug.utils.redirect("/shop/checkout")
+
+ @website.route(['/event/<int:event_id>/subscribe'], type='http', auth="public")
+ def subscribe(self, event_id=None, **post):
+ partner_obj = request.registry['res.partner']
+ event_obj = request.registry['event.event']
+ user_obj = request.registry['res.users']
+
+ if event_id and 'subscribe' in post and (post.get('email') or not request.webcontext.is_public_user):
+ if request.webcontext.is_public_user:
+ partner_ids = partner_obj.search(request.cr, SUPERUSER_ID, [("email", "=", post.get('email'))])
+ if not partner_ids:
+ partner_ids = [partner_obj.create(request.cr, SUPERUSER_ID, {"email": post.get('email'), "name": "Subscribe: %s" % post.get('email')})]
+ else:
+ partner_ids = [user_obj.browse(request.cr, request.uid, request.uid).partner_id.id]
+ event_obj.check_access_rule(request.cr, request.uid, [event_id], 'read')
+ event_obj.message_subscribe(request.cr, SUPERUSER_ID, [event_id], partner_ids)
+
+ return self.event(event_id=event_id, subscribe=post.get('email'))
+
+ @website.route(['/event/<int:event_id>/unsubscribe'], type='http', auth="public")
+ def unsubscribe(self, event_id=None, **post):
+ partner_obj = request.registry['res.partner']
+ event_obj = request.registry['event.event']
+ user_obj = request.registry['res.users']
+
+ if event_id and 'unsubscribe' in post and (post.get('email') or not request.webcontext.is_public_user):
+ if request.webcontext.is_public_user:
+ partner_ids = partner_obj.search(request.cr, SUPERUSER_ID, [("email", "=", post.get('email'))])
+ else:
+ partner_ids = [user_obj.browse(request.cr, request.uid, request.uid).partner_id.id]
+ event_obj.check_access_rule(request.cr, request.uid, [event_id], 'read')
+ event_obj.message_unsubscribe(request.cr, SUPERUSER_ID, [event_id], partner_ids)
+
+ return self.event(event_id=event_id, subscribe=None)
diff --git a/addons/website_event/event.py b/addons/website_event/event.py
index 3a880503bc9..05d032780da 100644
--- a/addons/website_event/event.py
+++ b/addons/website_event/event.py
@@ -11,8 +11,12 @@ class product(osv.osv):
}
-class event_event(osv.osv):
- _inherit = "event.event"
+class event(osv.osv):
+ _inherit = 'event.event'
+ _columns = {
+ 'website_published': fields.boolean('Available in the website'),
+ 'description_website': fields.html('Description for the website'),
+ }
def google_map_img(self, cr, uid, ids, zoom=8, width=298, height=298, context=None):
partner = self.browse(cr, uid, ids[0], context=context)
@@ -23,3 +27,18 @@ class event_event(osv.osv):
partner = self.browse(cr, uid, ids[0], context=context)
if partner.address_id:
return self.browse(cr, SUPERUSER_ID, ids[0], context=context).address_id.google_map_link()
+
+class sale_order_line(osv.osv):
+ _inherit = "sale.order.line"
+
+ def _recalculate_product_values(self, cr, uid, ids, product_id=None, context=None):
+ if not ids:
+ return super(sale_order_line, self)._recalculate_product_values(cr, uid, ids, product_id, context=context)
+
+ order_line = self.browse(cr, uid, ids[0], context=context)
+ product = product_id and self.pool.get('product.product').browse(cr, uid, product_id, context=context) or order_line.product_id
+ res = super(sale_order_line, self)._recalculate_product_values(cr, uid, ids, product.id, context=context)
+ if product.event_type_id and order_line.event_ticket_id and order_line.event_ticket_id.price != product.lst_price:
+ res.update({'price_unit': order_line.event_ticket_id.price})
+
+ return res
diff --git a/addons/website_event/event_data.xml b/addons/website_event/event_data.xml
new file mode 100644
index 00000000000..7f065af4c06
--- /dev/null
+++ b/addons/website_event/event_data.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data noupdate="1">
+
+ <record id="action_open_website" model="ir.actions.act_url">
+ <field name="name">Website Home</field>
+ <field name="target">self</field>
+ <field name="url">/event</field>
+ </record>
+ <record id="base.open_menu" model="ir.actions.todo">
+ <field name="action_id" ref="action_open_website"/>
+ <field name="state">open</field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/website_event/event_demo.xml b/addons/website_event/event_demo.xml
new file mode 100644
index 00000000000..a471f36a039
--- /dev/null
+++ b/addons/website_event/event_demo.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <record id="event_sale.event_technical_training" model="event.event">
+ <field name="website_published">True</field>
+ <field name="description_website"><![CDATA[
+<center><strong>OpenERP v.7 Technical Training in English (5 days)</strong></center>
+<p>&nbsp;</p>
+<p><strong>Course summary:</strong></p>
+<p>This course is dedicated to partners, integrators and developers who need to grasp knowledge of the OpenERP development process. This course is for new developers or for IT professionals eager to learn more about the OpenERP technical aspects.</p>
+<p>&nbsp;</p>
+<p><strong>Objectives:</strong></p>
+<p>Having attended this course, participants should be able to:</p>
+<ul>
+<li>Understand the development concepts and architecture;</li>
+<li>Install and administer OpenERP;</li>
+<li>Develop a new OpenERP module.</li>
+</ul>
+<p>&nbsp;</p>
+<p><strong>Our prices include:</strong></p>
+<ul>
+<li>drinks and lunch;</li>
+<li>training material.</li>
+</ul>
+<p>&nbsp;</p>
+<p><strong>Requirements:</strong></p>
+<ul>
+<li>Bring your own laptop.</li>
+<li>Participants are expected to have some knowledge in programming.&nbsp;A basic knowledge of the Python programming is recommended.</li>
+<li>Participants preferably have a functional knowledge of the OpenERP software (see Functional Training).</li>
+</ul>
+<p>&nbsp;</p>
+<p>For more information on the program, please explore <a href="http://www.openerp.com/services/technical-training">http://www.openerp.com/services/technical-training</a>.</p>
+<p>If you have a question<strong>&nbsp;concerning the content of the training</strong>, please contact <a href="mailto:training@openerp.com">training@openerp.com</a>.</p>
+<p>&nbsp;</p>
+<p><strong>Where to find us:</strong></p>
+<p>Chaussée de Namur 40, 1367 Ramillies (Belgium)</p>
+<p>More information about our Headquarter office (directions, transports, parking, hotels, ...), please have a look at&nbsp;<a href="http://bit.ly/VD8J67">http://bit.ly/VD8J67.</a></p>
+<p>&nbsp;</p>
+<p><strong>Cancellation Policy:&nbsp;</strong></p>
+<p>The organization of the training session has related costs. Due to these costs, cancellations made less than 2 weeks (14 calendar days) prior to the start of the training session is a subject to a fee. This fee can be up to a maximum of 1000€ per cancellation request.</p>
+<p>We strongly recommend to book your flight tickets and/or hotel reservations 2 weeks prior to the training. If the training is cancelled 2 weeks in advance, you'll be notified by email.</p>
+<div>&nbsp;</div>
+<p>For any additional information, please contact us at <a href="mailto:events@openerp.com">events@openerp.com</a>.</p>
+<p>&nbsp;</p>
+<p>Best regards,</p>
+<p>Miss Charline Louis, OpenERP Junior Event Manager</p>
+<p>&nbsp;</p>
+<p align="RIGHT"><em>(OpenERP reserves the right to cancel, re-name or re-locate<br/>the event or change the dates on which it is held.)</em></p>
+]]></field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/website_event/views/website_event.xml b/addons/website_event/views/website_event.xml
index 7c05419d15a..e4472308694 100644
--- a/addons/website_event/views/website_event.xml
+++ b/addons/website_event/views/website_event.xml
@@ -4,15 +4,23 @@
<!-- Layout add nav and footer -->
- <template id="footer_custom" inherit_id="website.layout" name="Custom Footer">
- <xpath expr="//body/header//ul[@id='top_menu']/li[last()]" position="before">
+ <template id="header_footer" inherit_id="website_sale.header_footer">
+ <xpath expr="//body/header//ul[@id='top_menu']/li" position="before">
<li><a href="/event">Events</a></li>
</xpath>
- <xpath expr="//body/footer//a[@href='/page/website.contactus']" position="after">
+ <xpath expr="//body/footer//ul[@name='products']/li" position="after">
<li><a href="/event">Events</a></li>
</xpath>
</template>
+ <template id="event_website_sale_mycart" inherit_id="website_sale.mycart">
+ <xpath expr="//small[@class='text-error']" position="replace">
+ <t t-if="(not line.event_id or line.event_ticket_id and line.event_ticket_id.price == line.product_id.lst_price)">
+ <small class="text-error" style="text-decoration: line-through;"><t t-esc="line.product_id.lst_price" /> €</small>
+ </t>
+ </xpath>
+ </template>
+
<!-- Page -->
<template id="index" name="Events" page="True">
@@ -22,10 +30,11 @@
<t t-raw="head or ''"/>
</t>
<t t-set="title">Events</t>
- <div class="container mt48">
+ <h1 class="text-center">Our Events</h1>
+ <div class="container">
<div class="row">
- <div class="span4 css_noprint" id="left_column">
- <ul class="nav nav-list">
+ <div class="col-md-4 css_noprint" id="left_column">
+ <ul class="nav nav-pills nav-stacked">
<li class="nav-header">Date</li>
<t t-foreach="dates" t-as="date">
<li t-att-class="searches.get('date') == date[0] and 'active' or ''">
@@ -34,22 +43,21 @@
</t>
</ul>
</div>
- <div class='span8 navbar navbar-inverse'>
- <div class='navbar-inner'>
- <t t-call="website.pager" >
- <t t-set="classname">pull-left</t>
- </t>
- </div>
+ <div class="col-md-8">
+ <t t-call="website.pager" >
+ <t t-set="classname">pull-left</t>
+ </t>
</div>
- <div class="span8">
+ <div class="col-md-8">
<ul class="media-list">
- <li t-foreach="event_ids" t-as="event" class="media thumbnail">
+ <li t-foreach="event_ids" t-as="event" class="media" data-publish="">
+ <t t-call="website.publish"><t t-set="object" t-value="event"/></t>
<div class="media-body">
- <span t-if="not event.event_ticket_ids" class="label pull-right">No tickets needed.</span>
+ <span t-if="not event.event_ticket_ids" class="label label-default pull-right">No tickets needed.</span>
<t t-if="event.event_ticket_ids">
- <span t-if="event.register_avail == 9999" class="label pull-right label-info">Tickets availables.</span>
- <span t-if="not event.register_avail" class="label pull-right">No ticket available.</span>
- <span t-if="event.register_avail and event.register_avail != 9999" t-attf-class="label pull-right label-#{ event.register_avail &lt;= 10 and 'warning' or 'info' }">
+ <span t-if="event.register_avail == 9999" class="label label-default pull-right label-info">Tickets availables.</span>
+ <span t-if="not event.register_avail" class="label label-default pull-right">No ticket available.</span>
+ <span t-if="event.register_avail and event.register_avail != 9999" t-attf-class="label label-default pull-right label-#{ event.register_avail &lt;= 10 and 'warning' or 'info' }">
<t t-if="event.register_avail &lt;= 10">Only</t>
<t t-esc="event.register_avail"/>
<t t-if="event.register_avail &gt; 1">tickets</t>
@@ -58,11 +66,10 @@
</span>
</t>
<h4 class="media-heading"><a t-attf-href="/event/#{ event.id }/"><span t-field="event.name"> </span></a></h4>
- <t t-call="website.publish"><t t-set="object" t-value="event"/></t>
<div>
<span t-field="event.type">: </span>
- <t t-if="event.user_id">
- Organized by: <span t-field="event.user_id"> </span>
+ <t t-if="event.organizer_id">
+ Organized by: <span t-field="event.organizer_id"> </span>
</t>
</div>
<div>
@@ -75,7 +82,7 @@
</li>
</ul>
</div>
- <div class="span8 offset4 text-center">
+ <div class="col-md-8 col-lg-offset-4 text-center">
<t t-call="website.pager" />
</div>
</div>
@@ -85,7 +92,7 @@
<template id="event_category" inherit_id="website_event.index" inherit_option_id="website_event.index" name="Category">
<xpath expr="//div[@id='left_column']" position="inside">
- <ul class="nav nav-list">
+ <ul class="nav nav-pills nav-stacked mt32">
<li class="nav-header">Category</li>
<t t-foreach="types">
<li t-if="type" t-att-class="searches.get('type') == str(type and type[0]) and 'active' or ''">
@@ -97,7 +104,7 @@
</template>
<template id="event_location" inherit_id="website_event.index" inherit_option_id="website_event.index" name="Location">
<xpath expr="//div[@id='left_column']" position="inside">
- <ul class="nav nav-list">
+ <ul class="nav nav-pills nav-stacked mt32">
<li class="nav-header">Location</li>
<t t-foreach="countries">
<li t-if="country_id" t-att-class="searches.get('country') == str(country_id and country_id[0]) and 'active' or ''">
@@ -115,9 +122,31 @@
<t t-raw="head or ''"/>
</t>
<t t-set="title">Events</t>
- <div class="container mt48">
+ <div class="container">
+ <t t-call="website.publish"><t t-set="object" t-value="event_id"/></t>
<div class="row">
- <div class="span4 css_noprint">
+ <div class="col-md-4">
+ <form action="./subscribe" method="POST" class="form-inline" t-if="not subscribe">
+ <div class="col-lg-7">
+ <input placeholder="Email Address" type="email" name="email" class="form-control" t-if="is_public_user"/>
+ </div>
+ <button type="submit" class="btn btn-primary" name="subscribe">Subscribe</button>
+ </form>
+ <form action="./unsubscribe" method="POST" class="form-inline" t-if="subscribe">
+ <input type="hidden" name="email" t-att-value="subscribe"/>
+ <button type="submit" class="btn btn-default" name="unsubscribe">Unsubscribe</button>
+ </form>
+ </div>
+ <div class="col-md-8">
+ <h1 class="text-center" t-field="event_id.name"></h1>
+ <h4 class="text-center">
+ <i class="icon-time"></i> <span t-field="event_id.date_begin"/> to
+ <span t-field="event_id.date_end"/>
+ </h4>
+ <h5 class="text-center" t-field="event_id.address_id"/>
+ </div>
+
+ <div class="col-md-4 css_noprint">
<h4>When &amp; Where</h4>
<a t-att-href="event_id.google_map_link()" target="_BLANK">
<img class="thumbnail" t-att-src="event_id.google_map_img()"/>
@@ -126,65 +155,59 @@
<pre t-field="event_id.address_id"/>
<i class="icon-time"></i> <span t-field="event_id.date_begin"> </span><br/>
<i class="icon-time"></i> <span t-field="event_id.date_end"> </span>
- <t t-if="event_id.user_id">
+ <t t-if="event_id.organizer_id">
<h6>Organized by:</h6>
- <pre><t t-field="event_id.organizer_id"/><br/><span>&amp;#x2706;</span> <span t-field="event_id.phone"></span><br/><i class="icon-envelope"></i> <span t-field="event_id.email"></span></pre>
+ <pre><t t-field="event_id.organizer_id"/><t t-if="event_id.phone"><br/><span>&amp;#x2706;</span> <span t-field="event_id.phone"></span></t><t t-if="event_id.email"><br/><i class="icon-envelope"></i> <span t-field="event_id.email"></span></t></pre>
</t>
</address>
</div>
- <div class="span8">
- <div class="media-body">
- <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-attf-class="label pull-right label-#{ 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>
- <t t-if="event_id.register_avail == 1">ticket </t>
- available.
- </span>
- </t>
- <h4 class="media-heading"><a t-attf-href="/event/#{ event_id.id }/"><span t-field="event_id.name"> </span></a></h4>
- <t t-call="website.publish"><t t-set="object" t-value="event_id"/></t>
- <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>
- <h4 t-if="event_id.event_ticket_ids">Ticket Information</h4>
- <form t-attf-action="/event/#{ event_id.id }/add_cart" method="post" t-if="event_id.event_ticket_ids">
- <table class="table">
- <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-if="ticket.register_avail" t-attf-name="ticket- #{ ticket.id }">
- <t t-foreach="range(0, ticket.register_avail > 9 and 10 or ticket.register_avail+1 )" t-as="nb"><option t-esc="nb"/></t>
- </select>
- <span t-if="not ticket.register_avail">Not ticket available</span>
- </td>
- </tr>
- </tbody>
- </table>
- <button type="submit" class="btn btn-primary" t-if="event_id.register_avail">Order Now</button>
- </form>
- <h4>Event Details</h4>
- <div t-field="event_id.description_website"></div>
- </div>
+ <div class="col-md-8">
+ <t t-if="event_id.event_ticket_ids">
+ <hr/>
+ <form t-attf-action="/event/#{ event_id.id }/add_cart" method="post">
+ <table class="table">
+ <thead>
+ <tr>
+ <th>Ticket</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.name"/>
+ <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-if="ticket.register_avail" t-attf-name="ticket- #{ ticket.id }" class="form-control">
+ <t t-foreach="range(0, ticket.register_avail > 9 and 10 or ticket.register_avail+1 )" t-as="nb"><option t-esc="nb"/></t>
+ </select>
+ <span t-if="not ticket.register_avail">Not ticket available</span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <button type="submit" class="btn btn-primary" t-if="event_id.register_avail">Order Now</button>
+ </form>
+ </t>
+ <hr/>
+ <div t-field="event_id.description_website"></div>
+ <hr/>
+ <ul class="media-list" id="comment">
+ <li t-foreach="message_ids" t-as="comment" class="media">
+ <div class="media-body">
+ <t t-call="website.publish"><t t-set="object" t-value="comment"/></t>
+ <t t-raw="comment.body"/>
+ <small class="pull-right muted text-right">
+ <div t-field="comment.author_id"/>
+ <div t-field="comment.date"/>
+ </small>
+ </div>
+ </li>
+ </ul>
</div>
</div>
</div>