summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabien Pinckaers <fp@tinyerp.com>2013-11-24 22:02:21 +0100
committerFabien Pinckaers <fp@tinyerp.com>2013-11-24 22:02:21 +0100
commit105fc16c117e783fe4e1fb28e52b7aadea8b9a2a (patch)
tree58361baef1dc745553b48f23ea2551ad4029e461
parentfb0abe39bc4742f8080feefcadecc6e5b2e315c5 (diff)
[IMP] events improvements
bzr revid: fp@tinyerp.com-20131124210221-hwalp7983olmrhew
-rw-r--r--addons/website/controllers/main.py39
-rw-r--r--addons/website/models/website.py37
-rw-r--r--addons/website_event/controllers/main.py11
-rw-r--r--addons/website_event/data/event_demo.xml1
-rw-r--r--addons/website_event/models/event.py44
-rw-r--r--addons/website_event/views/website_event.xml21
-rw-r--r--addons/website_event_track/data/event_demo.xml7
-rw-r--r--addons/website_event_track/models/event.py9
-rw-r--r--addons/website_event_track/views/website_event.xml114
9 files changed, 197 insertions, 86 deletions
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index 6b11c065552..9a9bffe332e 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -48,42 +48,9 @@ class Website(openerp.addons.web.controllers.main.Home):
@website.route('/pagenew/<path:path>', type='http', auth="user")
def pagenew(self, path, noredirect=NOPE):
- module = 'website'
- # completely arbitrary max_length
- idname = slugify(path, max_length=50)
-
- request.cr.execute('SAVEPOINT pagenew')
- imd = request.registry['ir.model.data']
- view = request.registry['ir.ui.view']
- view_model, view_id = imd.get_object_reference(
- request.cr, request.uid, 'website', 'default_page')
- newview_id = view.copy(
- request.cr, request.uid, view_id, context=request.context)
- newview = view.browse(
- request.cr, request.uid, newview_id, context=request.context)
- newview.write({
- 'arch': newview.arch.replace("website.default_page",
- "%s.%s" % (module, idname)),
- 'name': path,
- 'page': True,
- })
- # Fuck it, we're doing it live
- try:
- imd.create(request.cr, request.uid, {
- 'name': idname,
- 'module': module,
- 'model': 'ir.ui.view',
- 'res_id': newview_id,
- 'noupdate': True
- }, context=request.context)
- except psycopg2.IntegrityError:
- logger.exception('Unable to create ir_model_data for page %s', path)
- request.cr.execute('ROLLBACK TO SAVEPOINT pagenew')
- return werkzeug.exceptions.InternalServerError()
- else:
- request.cr.execute('RELEASE SAVEPOINT pagenew')
-
- url = "/page/%s" % idname
+ web = request.registry['website']
+ path = web.new_page(request.cr, request.uid, path, request.context)
+ url = "/page/" + path
if noredirect is not NOPE:
return werkzeug.wrappers.Response(url, mimetype='text/plain')
return werkzeug.utils.redirect(url)
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index 735c1ae06c4..2a4beeeb598 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -21,6 +21,7 @@ from openerp.tools.safe_eval import safe_eval
from openerp.addons.web import http
from openerp.addons.web.http import request, LazyResponse
+from ..utils import slugify
logger = logging.getLogger(__name__)
@@ -117,6 +118,41 @@ class website(osv.osv):
}
public_user = None
+ def new_page(self, cr, uid, name, template='website.default_page', ispage=True, context=None):
+ context=context or {}
+ # completely arbitrary max_length
+ idname = slugify(name, max_length=50)
+
+ cr.execute('SAVEPOINT pagenew')
+ imd = self.pool.get('ir.model.data')
+ view = self.pool.get('ir.ui.view')
+
+ module, tmp_page = template.split('.')
+ view_model, view_id = imd.get_object_reference(cr, uid, tmp_mod, tmp_page)
+
+ newview_id = view.copy(cr, uid, view_id, context=context)
+ newview = view.browse(cr, uid, newview_id, context=context)
+ newview.write({
+ 'arch': newview.arch.replace(template, "%s.%s" % (module, idname)),
+ 'name': name,
+ 'page': ispage,
+ })
+ # Fuck it, we're doing it live
+ try:
+ imd.create(cr, uid, {
+ 'name': idname,
+ 'module': module,
+ 'model': 'ir.ui.view',
+ 'res_id': newview_id,
+ 'noupdate': True
+ }, context=request.context)
+ except psycopg2.IntegrityError:
+ logger.exception('Unable to create ir_model_data for page %s', path)
+ request.cr.execute('ROLLBACK TO SAVEPOINT pagenew')
+ return werkzeug.exceptions.InternalServerError()
+ else:
+ request.cr.execute('RELEASE SAVEPOINT pagenew')
+ return "%s.%s" % (module, idname)
def get_public_user(self, cr, uid, context=None):
if not self.public_user:
@@ -508,6 +544,7 @@ class website_menu(osv.osv):
_defaults = {
'url': '',
'sequence': 0,
+ 'new_window': False,
}
_parent_store = True
_parent_order = 'sequence, name'
diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py
index 9ea85b68479..2d37a34cb30 100644
--- a/addons/website_event/controllers/main.py
+++ b/addons/website_event/controllers/main.py
@@ -165,14 +165,23 @@ class website_event(http.Controller):
@website.route(['/event/<model("event.event"):event>'], type='http', auth="public", multilang=True)
def event(self, event=None, **post):
+ print 'ICI'
+ if event.menu_id and event.menu_id.child_id:
+ print 'MENU', website.menu_id.child_id[0].url
+ return request.redirect(website.menu_id.child_id[0].url)
+ return request.redirect('/event/register/'+event.id)
+
+ @website.route(['/event/register/<model("event.event"):event>'], type='http', auth="public", multilang=True)
+ def event(self, event=None, **post):
values = {
'event': event,
'range': range,
}
return request.website.render("website_event.event_description_full", values)
- @website.route(['/event/<int:event_id>/add_cart'], type='http', auth="public", multilang=True)
+ @website.route(['/event/add_cart'], type='http', auth="public", multilang=True)
def add_cart(self, event_id=None, **post):
+ assert event_id, 'An event is required'
user_obj = request.registry['res.users']
order_line_obj = request.registry.get('sale.order.line')
ticket_obj = request.registry.get('event.event.ticket')
diff --git a/addons/website_event/data/event_demo.xml b/addons/website_event/data/event_demo.xml
index 4da5b931d32..a08ca75e952 100644
--- a/addons/website_event/data/event_demo.xml
+++ b/addons/website_event/data/event_demo.xml
@@ -5,6 +5,7 @@
<record id="base.res_partner_6" model="res.partner">
<field name="website_published">True</field>
</record>
+
<record id="event.event_0" model="event.event">
<field name="website_published">True</field>
<field name="twitter_hashtag">openerp</field>
diff --git a/addons/website_event/models/event.py b/addons/website_event/models/event.py
index 4b16f0fa49e..50ea7696575 100644
--- a/addons/website_event/models/event.py
+++ b/addons/website_event/models/event.py
@@ -35,6 +35,48 @@ class event(osv.osv):
_name = 'event.event'
_inherit = ['event.event','website.seo.metadata']
+ def _get_new_menu_pages(serf, cr, uid, event, context=None):
+ context = context or {}
+ todo = [
+ (_('Introduction'), 'website_event.template_intro'),
+ (_('Location'), 'website_event.template_location')
+ ]
+ web = request.registry['website']
+ result = []
+ for name,path in todo:
+ newpath = web.new_page(request.cr, request.uid, path, request.context)
+ url = "/event/event.id/page/" + newpath
+ result.append((name, newpath))
+ return result
+
+ def _set_show_menu(self, cr, uid, ids, name, value, arg, context=None):
+ menuobj = self.pool.get('website.menu')
+ for event in self.browse(cr, uid, ids, context=context):
+ if event.menu_id and not value:
+ menuobj.unlink(cr, uid, [event.menu_id.id], context=context)
+ elif value and not event.menu_id:
+ root = menuobj.create(cr, uid, {
+ 'name': event.name
+ }, context=context)
+ tocreate = self._get_new_menu_pages(cr, uid, event, context)
+ tocreate.append((_('Register'), '/event/register/'+str(event.id)))
+ sequence = 0
+ for name,url in tocreate:
+ menuobj.create(cr, uid, {
+ 'name': name,
+ 'url': url,
+ 'parent_id': root,
+ 'sequence': sequence
+ }, context=context)
+ sequence += 1
+ return True
+
+ def _get_show_menu(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict.fromkeys(ids, '')
+ for event in self.browse(cr, uid, ids, context=context):
+ res[event.id] = bool(event.menu_id)
+ return res
+
def _website_url(self, cr, uid, ids, field_name, arg, context=None):
res = dict.fromkeys(ids, '')
base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
@@ -55,7 +97,7 @@ class event(osv.osv):
help="Website communication history",
),
'website_url': fields.function(_website_url, string="Website url"),
- 'show_menu': fields.boolean('Dedicated Menu'),
+ 'show_menu': fields.function(_get_show_menu, fnct_inv=_set_show_menu, type='boolean', string='Dedicated Menu'),
'menu_id': fields.many2one('website.menu', 'Event Menu'),
}
_defaults = {
diff --git a/addons/website_event/views/website_event.xml b/addons/website_event/views/website_event.xml
index 783158b18d5..d3f2c89e256 100644
--- a/addons/website_event/views/website_event.xml
+++ b/addons/website_event/views/website_event.xml
@@ -203,6 +203,24 @@
</t>
</template>
+ <template id="template_location">
+ <t t-call="website_event.layout">
+ <section class="container" data-snippet-id="title">
+ <h1 class="text-center">Event Location</h1>
+ </section>
+ <div class="oe_structure oe_empty"/>
+ </t>
+ </template>
+
+ <template id="template_intro">
+ <t t-call="website_event.layout">
+ <section class="container" data-snippet-id="title">
+ <h1 class="text-center">Event Introduction</h1>
+ </section>
+ <div class="oe_structure oe_empty"/>
+ </t>
+ </template>
+
<template id="event_description_full">
<t t-call="website_event.layout">
<div class="container">
@@ -216,10 +234,9 @@
<span t-field="event.city"/>,
<span t-field="event.country_id"/>
</h4>
-
<div class="row mt32 mb32">
<div class="col-md-8">
- <form t-action="/event/#{ event.id }/add_cart" method="post" t-if="event.event_ticket_ids">
+ <form t-action="/event/add_cart?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
<table class="table table-striped">
<thead>
<tr>
diff --git a/addons/website_event_track/data/event_demo.xml b/addons/website_event_track/data/event_demo.xml
index c585ae152f0..3124a901a0e 100644
--- a/addons/website_event_track/data/event_demo.xml
+++ b/addons/website_event_track/data/event_demo.xml
@@ -29,5 +29,12 @@
<field name="name">Room 4</field>
</record>
+ <!--
+ This should be done at the end so that the menu is complete
+ -->
+ <record id="event.event_0" model="event.event">
+ <field name="show_menu">True</field>
+ </record>
+
</data>
</openerp>
diff --git a/addons/website_event_track/models/event.py b/addons/website_event_track/models/event.py
index 8aee5d85766..c235c05a3f2 100644
--- a/addons/website_event_track/models/event.py
+++ b/addons/website_event_track/models/event.py
@@ -99,7 +99,6 @@ class event_track(osv.osv):
'stage_id': _read_group_stage_ids,
}
-
#
# Events
#
@@ -120,4 +119,12 @@ class event_event(osv.osv):
'show_tracks': False,
'show_blog': False,
}
+ def _get_new_menu_pages(serf, cr, uid, event, context=None):
+ context = context or {}
+ result = super(event_event, self)._get_new_menu_pages(cr, uid, event, context=context)
+ if event.blog_id:
+ pass
+ if event.show_track_proposal:
+ result.append( _('Talk Proposals'), '/event/track_proposal/'+str(event.id))
+ return result
diff --git a/addons/website_event_track/views/website_event.xml b/addons/website_event_track/views/website_event.xml
index 367c1e4e084..6cc2a6ae5fe 100644
--- a/addons/website_event_track/views/website_event.xml
+++ b/addons/website_event_track/views/website_event.xml
@@ -39,6 +39,10 @@
<t t-call="website_event.layout">
<div class="oe_structure"/>
<div class="container">
+ <section data-snippet-id="title">
+ <h1 class="text-center mb0">Call for Proposals</h1>
+ <h2 class="text-center text-muted mb32" t-esc="event.name"></h2>
+ </section>
<section id="forms" t-if="not event.show_track_proposal">
<h1>Proposals are closed!</h1>
<p>
@@ -47,60 +51,80 @@
</section>
<section class="row">
<div class="col-md-7">
- <div class="oe_structure"/>
- <div class="row">
- <section id="forms" t-if="event.show_track_proposal">
- <form class="form-horizontal mt32" action="/event/track_proposal/success" method="post" enctype="multipart/form-data">
- <input type="hidden" t-att-value="event.id" name="event"/>
- <div class="form-group">
- <label class="col-md-3 col-sm-4 control-label" for="partner_name">Speaker Name</label>
- <div class="col-md-7 col-sm-8">
- <input type="text" class="form-control" name="partner_name" required="True" />
- </div>
+ <div class="oe_structure">
+ <section data-snippet-id="text">
+ <h3 class="page-header mt16">
+ Introduction
+ </h3>
+ <p>
+ We will accept a broad range of
+ presentations, from reports on academic and
+ commercial projects to tutorials and case
+ studies. As long as the presentation is
+ interesting and potentially useful to the
+ audience, it will be considered for
+ inclusion in the programme.
+ </p>
+ </section>
+ <section data-snippet-id="text">
+ <h3 class="page-header">Application</h3>
+ <p>
+ Fill this form to propose your talk.
+
+ </p>
+ </section>
+ </div>
+ <section id="forms" t-if="event.show_track_proposal">
+ <form class="form-horizontal mt32" action="/event/track_proposal/success" method="post" enctype="multipart/form-data">
+ <input type="hidden" t-att-value="event.id" name="event"/>
+ <div class="form-group">
+ <label class="col-md-3 col-sm-4 control-label" for="partner_name">Speaker Name</label>
+ <div class="col-md-7 col-sm-8">
+ <input type="text" class="form-control" name="partner_name" required="True" />
</div>
- <div class="form-group">
- <label class="col-md-3 col-sm-4 control-label" for="email_from">Your Email</label>
- <div class="col-md-7 col-sm-8">
- <input type="email" class="form-control" name="email_from" required="True" />
- </div>
+ </div>
+ <div class="form-group">
+ <label class="col-md-3 col-sm-4 control-label" for="email_from">Your Email</label>
+ <div class="col-md-7 col-sm-8">
+ <input type="email" class="form-control" name="email_from" required="True" />
</div>
- <div class="form-group">
- <label class="col-md-3 col-sm-4 control-label" for="phone">Your Phone</label>
- <div class="col-md-7 col-sm-8">
- <input type="text" class="form-control" name="phone" required="True" />
- </div>
+ </div>
+ <div class="form-group">
+ <label class="col-md-3 col-sm-4 control-label" for="phone">Your Phone</label>
+ <div class="col-md-7 col-sm-8">
+ <input type="text" class="form-control" name="phone" required="True" />
</div>
- <div class="form-group">
- <label class="col-md-3 col-sm-4 control-label" for="phone">Tags</label>
- <div class="col-md-7 col-sm-8">
- <div class="row">
- <div class="col-sm-4" t-foreach="event.track_tag_ids" t-as="tag">
- <input type="checkbox" t-att-value="tag.id" name="tags"/>
- <t t-esc="tag.name"/>
- </div>
+ </div>
+ <div class="form-group">
+ <label class="col-md-3 col-sm-4 control-label" for="phone">Tags</label>
+ <div class="col-md-7 col-sm-8">
+ <div class="row">
+ <div class="col-sm-4" t-foreach="event.track_tag_ids" t-as="tag">
+ <input type="checkbox" t-att-value="tag.id" name="tags"/>
+ <t t-esc="tag.name"/>
</div>
</div>
</div>
- <div class="form-group">
- <label class="col-md-3 col-sm-4 control-label" for="phone">Speaker Biography</label>
- <div class="col-md-7 col-sm-8">
- <textarea class="form-control" name="biography" style="min-height: 120px"/>
- </div>
+ </div>
+ <div class="form-group">
+ <label class="col-md-3 col-sm-4 control-label" for="phone">Speaker Biography</label>
+ <div class="col-md-7 col-sm-8">
+ <textarea class="form-control" name="biography" style="min-height: 120px"/>
</div>
- <div class="form-group">
- <label class="col-md-3 col-sm-4 control-label" for="description">Talk Introduction</label>
- <div class="col-md-7 col-sm-8">
- <textarea class="form-control" name="description" style="min-height: 120px"/>
- </div>
+ </div>
+ <div class="form-group">
+ <label class="col-md-3 col-sm-4 control-label" for="description">Talk Introduction</label>
+ <div class="col-md-7 col-sm-8">
+ <textarea class="form-control" name="description" style="min-height: 120px"/>
</div>
- <div class="form-group">
- <div class="col-md-offset-3 col-sm-offset-4 col-sm-8 col-md-7">
- <button type="submit" class="btn btn-primary">Submit Proposal</button>
- </div>
+ </div>
+ <div class="form-group">
+ <div class="col-md-offset-3 col-sm-offset-4 col-sm-8 col-md-7">
+ <button type="submit" class="btn btn-primary">Submit Proposal</button>
</div>
- </form>
- </section>
- </div>
+ </div>
+ </form>
+ </section>
<div class="oe_structure"/>
</div><div class="col-md-4 col-md-offset-1">
<div class="panel panel-default">