X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fwebsite%2Fcontrollers%2Fmain.py;h=d5d9b7582e5521e348d5b86e5006c81bfc517a2a;hb=2d296cb77922d33be2dc45b900191fac34bda429;hp=0a2a5ed1397149ff65bd0c249c75b1607a2e4e33;hpb=8d822419e74969ff032db653a3797affeccace1b;p=odoo%2Fodoo.git diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 0a2a5ed..d5d9b75 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -3,12 +3,15 @@ import cStringIO import datetime from itertools import islice import json +import xml.etree.ElementTree as ET + import logging import re from sys import maxint import werkzeug.utils +import urllib2 import werkzeug.wrappers from PIL import Image @@ -32,14 +35,15 @@ class Website(openerp.addons.web.controllers.main.Home): page = 'homepage' try: main_menu = request.registry['ir.model.data'].get_object(request.cr, request.uid, 'website', 'main_menu') + except Exception: + pass + else: first_menu = main_menu.child_id and main_menu.child_id[0] if first_menu: if not (first_menu.url.startswith(('/page/', '/?', '/#')) or (first_menu.url=='/')): return request.redirect(first_menu.url) if first_menu.url.startswith('/page/'): - page = first_menu[6:] - except: - pass + return request.registry['ir.http'].reroute(first_menu.url) return self.page(page) @http.route(website=True, auth="public") @@ -47,13 +51,15 @@ class Website(openerp.addons.web.controllers.main.Home): # TODO: can't we just put auth=public, ... in web client ? return super(Website, self).web_login(*args, **kw) - @http.route('/page/', type='http', auth="public", website=True) + @http.route('/page/', type='http', auth="public", website=True) def page(self, page, **opt): values = { 'path': page, } - # allow shortcut for /page/ - if '.' not in page: + # /page/website.XXX --> /page/XXX + if page.startswith('website.'): + return request.redirect('/page/' + page[8:], code=301) + elif '.' not in page: page = 'website.%s' % page try: @@ -135,6 +141,22 @@ class Website(openerp.addons.web.controllers.main.Home): return request.make_response(content, [('Content-Type', mimetype)]) + @http.route('/website/info', type='http', auth="public", website=True) + def website_info(self): + try: + request.website.get_template('website.info').name + except Exception, e: + return request.registry['ir.http']._handle_exception(e, 404) + irm = request.env()['ir.module.module'].sudo() + apps = irm.search([('state','=','installed'),('application','=',True)]) + modules = irm.search([('state','=','installed'),('application','=',False)]) + values = { + 'apps': apps, + 'modules': modules, + 'version': openerp.service.common.exp_version() + } + return request.render('website.info', values) + #------------------------------------------------------ # Edit #------------------------------------------------------ @@ -164,19 +186,18 @@ class Website(openerp.addons.web.controllers.main.Home): request.cr, request.uid, 'website', 'theme') views = Views.search(request.cr, request.uid, [ ('inherit_id', '=', theme_template_id), - ('application', '=', 'enabled'), ], context=request.context) Views.write(request.cr, request.uid, views, { - 'application': 'disabled', - }, context=request.context) + 'active': False, + }, context=dict(request.context or {}, active_test=True)) if theme_id: module, xml_id = theme_id.split('.') _, view_id = imd.get_object_reference( request.cr, request.uid, module, xml_id) Views.write(request.cr, request.uid, [view_id], { - 'application': 'enabled' - }, context=request.context) + 'active': True + }, context=dict(request.context or {}, active_test=True)) return request.render('website.themes', {'theme_changed': True}) @@ -190,14 +211,19 @@ class Website(openerp.addons.web.controllers.main.Home): modules_to_update = [] for temp_id in templates: view = request.registry['ir.ui.view'].browse(request.cr, request.uid, int(temp_id), context=request.context) + if view.page: + continue view.model_data_id.write({ 'noupdate': False }) if view.model_data_id.module not in modules_to_update: modules_to_update.append(view.model_data_id.module) - module_obj = request.registry['ir.module.module'] - module_ids = module_obj.search(request.cr, request.uid, [('name', 'in', modules_to_update)], context=request.context) - module_obj.button_immediate_upgrade(request.cr, request.uid, module_ids, context=request.context) + + if modules_to_update: + module_obj = request.registry['ir.module.module'] + module_ids = module_obj.search(request.cr, request.uid, [('name', 'in', modules_to_update)], context=request.context) + if module_ids: + module_obj.button_immediate_upgrade(request.cr, request.uid, module_ids, context=request.context) return request.redirect(redirect) @http.route('/website/customize_template_get', type='json', auth='user', website=True) @@ -215,13 +241,13 @@ class Website(openerp.addons.web.controllers.main.Home): user_groups = set(user.groups_id) views = request.registry["ir.ui.view"]\ - ._views_get(request.cr, request.uid, xml_id, context=request.context) + ._views_get(request.cr, request.uid, xml_id, context=dict(request.context or {}, active_test=False)) done = set() result = [] for v in views: if not user_groups.issuperset(v.groups_id): continue - if full or (v.application != 'always' and v.inherit_id.id != view_theme_id): + if full or (v.customize_show and v.inherit_id.id != view_theme_id): if v.inherit_id not in done: result.append({ 'name': v.inherit_id.name, @@ -238,7 +264,7 @@ class Website(openerp.addons.web.controllers.main.Home): 'xml_id': v.xml_id, 'inherit_id': v.inherit_id.id, 'header': False, - 'active': v.application in ('always', 'enabled'), + 'active': v.active, }) return result @@ -347,6 +373,18 @@ class Website(openerp.addons.web.controllers.main.Home): obj = _object.browse(request.cr, request.uid, _id) return bool(obj.website_published) + @http.route(['/website/seo_suggest/'], type='http', auth="public", website=True) + def seo_suggest(self, keywords): + url = "http://google.com/complete/search" + try: + req = urllib2.Request("%s?%s" % (url, werkzeug.url_encode({ + 'ie': 'utf8', 'oe': 'utf8', 'output': 'toolbar', 'q': keywords}))) + request = urllib2.urlopen(req) + except (urllib2.HTTPError, urllib2.URLError): + return [] + xmlroot = ET.fromstring(request.read()) + return json.dumps([sugg[0].attrib['data'] for sugg in xmlroot if len(sugg) and sugg[0].attrib['data']]) + #------------------------------------------------------ # Helpers #------------------------------------------------------ @@ -359,7 +397,8 @@ class Website(openerp.addons.web.controllers.main.Home): @http.route([ '/website/image', - '/website/image///' + '/website/image///', + '/website/image////x' ], auth="public", website=True) def website_image(self, model, id, field, max_width=None, max_height=None): """ Fetches the requested field and ensures it does not go above @@ -376,10 +415,15 @@ class Website(openerp.addons.web.controllers.main.Home): The requested field is assumed to be base64-encoded image data in all cases. """ - response = werkzeug.wrappers.Response() - return request.registry['website']._image( - request.cr, request.uid, model, id, field, response, max_width, max_height) - + try: + response = werkzeug.wrappers.Response() + return request.registry['website']._image( + request.cr, request.uid, model, id, field, response, max_width, max_height) + except Exception: + logger.exception("Cannot render image field %r of record %s[%s] at size(%s,%s)", + field, model, id, max_width, max_height) + response = werkzeug.wrappers.Response() + return self.placeholder(response) #------------------------------------------------------ # Server actions @@ -411,7 +455,7 @@ class Website(openerp.addons.web.controllers.main.Home): action = ServerActions.browse(cr, uid, action_id, context=context) if action.state == 'code' and action.website_published: action_res = ServerActions.run(cr, uid, [action_id], context=context) - if isinstance(action_res, Response): + if isinstance(action_res, werkzeug.wrappers.Response): res = action_res if res: return res