diff options
| -rw-r--r-- | addons/website/controllers/main.py | 39 | ||||
| -rw-r--r-- | addons/website/models/website.py | 37 | ||||
| -rw-r--r-- | addons/website_event/controllers/main.py | 11 | ||||
| -rw-r--r-- | addons/website_event/data/event_demo.xml | 1 | ||||
| -rw-r--r-- | addons/website_event/models/event.py | 44 | ||||
| -rw-r--r-- | addons/website_event/views/website_event.xml | 21 | ||||
| -rw-r--r-- | addons/website_event_track/data/event_demo.xml | 7 | ||||
| -rw-r--r-- | addons/website_event_track/models/event.py | 9 | ||||
| -rw-r--r-- | addons/website_event_track/views/website_event.xml | 114 |
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"> |
