[IMP] events improvements
bzr revid: fp@tinyerp.com-20131124210221-hwalp7983olmrhew
This commit is contained in:
parent
fb0abe39bc
commit
105fc16c11
|
@ -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)
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in New Issue