[IMP] events improvements

bzr revid: fp@tinyerp.com-20131124210221-hwalp7983olmrhew
This commit is contained in:
Fabien Pinckaers 2013-11-24 22:02:21 +01:00
parent fb0abe39bc
commit 105fc16c11
9 changed files with 197 additions and 86 deletions

View File

@ -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)

View File

@ -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'

View File

@ -164,6 +164,14 @@ class website_event(http.Controller):
return request.website.render("website_event.index", values)
@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,
@ -171,8 +179,9 @@ class website_event(http.Controller):
}
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')

View File

@ -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>

View File

@ -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 = {

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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">