diff options
Diffstat (limited to 'addons/website/models')
| -rw-r--r-- | addons/website/models/__init__.py | 1 | ||||
| -rw-r--r-- | addons/website/models/ir_actions.py | 35 | ||||
| -rw-r--r-- | addons/website/models/ir_http.py | 2 | ||||
| -rw-r--r-- | addons/website/models/ir_ui_view.py | 41 | ||||
| -rw-r--r-- | addons/website/models/res_config.py | 8 | ||||
| -rw-r--r-- | addons/website/models/website.py | 65 |
6 files changed, 102 insertions, 50 deletions
diff --git a/addons/website/models/__init__.py b/addons/website/models/__init__.py index e17fba63e39..da3c232a24e 100644 --- a/addons/website/models/__init__.py +++ b/addons/website/models/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +import ir_actions import ir_ui_view import website import ir_qweb diff --git a/addons/website/models/ir_actions.py b/addons/website/models/ir_actions.py new file mode 100644 index 00000000000..731ee4c47e6 --- /dev/null +++ b/addons/website/models/ir_actions.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +from openerp.addons.web.http import request +from openerp.osv import fields, osv + + +class actions_server(osv.Model): + """ Add website option in server actions. """ + _name = 'ir.actions.server' + _inherit = ['ir.actions.server'] + + _columns = { + 'website_published': fields.boolean( + 'Available on the Website', + help='A code server action can be executed from the website, using a dedicated' + 'controller. The address is <base>/website/action/<id_or_xml_id>.' + 'Set this field as True to allow users to run this action. If it' + 'set to is False the action cannot be run through the website.'), + } + + def _get_eval_context(self, cr, uid, action, context=None): + """ Override to add the request object in eval_context. """ + eval_context = super(actions_server, self)._get_eval_context(cr, uid, action, context=context) + if action.state == 'code': + eval_context['request'] = request + return eval_context + + def run_action_code_multi(self, cr, uid, action, eval_context=None, context=None): + """ Override to allow returning response the same way action is already + returned by the basic server action behavior. Note that response has + priority over action, avoid using both. """ + res = super(actions_server, self).run_action_code_multi(cr, uid, action, eval_context, context) + if 'response' in eval_context: + return eval_context['response'] + return res diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index 6948f102fec..46b9efc15a8 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -167,5 +167,5 @@ class PageConverter(werkzeug.routing.PathConverter): for view in views: xid = xids[view['id']] - if xid and (not query or query in xid): + if xid and (not query or query.lower() in xid.lower()): yield xid diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index 95e2179c9ec..a789657dad3 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -1,8 +1,12 @@ # -*- coding: utf-8 -*- import copy +import simplejson +import werkzeug from lxml import etree, html +from openerp.addons.website.models import website +from openerp.http import request from openerp.osv import osv, fields class view(osv.osv): @@ -117,6 +121,43 @@ class view(osv.osv): return arch + def render(self, cr, uid, id_or_xml_id, values=None, engine='ir.qweb', context=None): + if getattr(request, 'website_enabled', False): + engine='website.qweb' + + if isinstance(id_or_xml_id, list): + id_or_xml_id = id_or_xml_id[0] + if isinstance(id_or_xml_id, (int, long)): + id_or_xml_id = self.get_view_xmlid(cr, uid, id_or_xml_id) + + if not context: + context = {} + + qcontext = dict(editable=False) + qcontext.update( + context.copy(), + website=request.website, + url_for=website.url_for, + slug=website.slug, + res_company=request.website.company_id, + user_id=self.pool.get("res.users").browse(cr, uid, uid), + ) + + # add some values + if values: + qcontext.update(values) + + # in edit mode ir.ui.view will tag nodes + context['inherit_branding'] = qcontext['editable'] + + view_obj = request.website.get_template(id_or_xml_id) + if 'main_object' not in qcontext: + qcontext['main_object'] = view_obj + + values = qcontext + + return super(view, self).render(cr, uid, id_or_xml_id, values=values, engine=engine, context=context) + def save(self, cr, uid, res_id, value, xpath=None, context=None): """ Update a view section. The view section may embed fields to write diff --git a/addons/website/models/res_config.py b/addons/website/models/res_config.py index 9823d286f37..1ae491388a3 100644 --- a/addons/website/models/res_config.py +++ b/addons/website/models/res_config.py @@ -29,6 +29,14 @@ class website_config_settings(osv.osv_memory): values[fname] = v[0] if v and self._columns[fname]._type == 'many2one' else v return {'value' : values} + # FIXME in trunk for god sake. Change the fields above to fields.char instead of fields.related, + # and create the function set_website who will set the value on the website_id + # create does not forward the values to the related many2one. Write does. + def create(self, cr, uid, vals, context=None): + config_id = super(website_config_settings, self).create(cr, uid, vals, context=context) + self.write(cr, uid, config_id, vals, context=context) + return config_id + _defaults = { 'website_id': lambda self,cr,uid,c: self.pool.get('website').search(cr, uid, [], context=c)[0], } diff --git a/addons/website/models/website.py b/addons/website/models/website.py index e3c683861f9..38e47cabf58 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -import fnmatch import inspect import itertools import logging @@ -7,7 +6,6 @@ import math import re import urlparse -import simplejson import werkzeug import werkzeug.exceptions import werkzeug.wrappers @@ -24,24 +22,19 @@ from openerp.addons.web.http import request, LazyResponse logger = logging.getLogger(__name__) -def keep_query(*args, **kw): - if not args and not kw: - args = ('*',) - params = kw.copy() - query_params = frozenset(werkzeug.url_decode(request.httprequest.query_string).keys()) - for keep_param in args: - for param in fnmatch.filter(query_params, keep_param): - if param not in params and param in request.params: - params[param] = request.params[param] - return werkzeug.urls.url_encode(params) - def url_for(path_or_uri, lang=None): + if isinstance(path_or_uri, unicode): + path_or_uri = path_or_uri.encode('utf-8') + current_path = request.httprequest.path + if isinstance(current_path, unicode): + current_path = current_path.encode('utf-8') location = path_or_uri.strip() force_lang = lang is not None url = urlparse.urlparse(location) if request and not url.netloc and not url.scheme and (url.path or force_lang): - location = urlparse.urljoin(request.httprequest.path, location) + location = urlparse.urljoin(current_path, location) + lang = lang or request.context.get('lang') langs = [lg[0] for lg in request.website.get_languages()] @@ -59,7 +52,7 @@ def url_for(path_or_uri, lang=None): ps.insert(1, lang) location = '/'.join(ps) - return location + return location.decode('utf-8') def is_multilang_url(path, langs=None): if not langs: @@ -78,7 +71,11 @@ def is_multilang_url(path, langs=None): def slugify(s, max_length=None): if slugify_lib: - return slugify_lib.slugify(s, max_length) + # There are 2 different libraries only python-slugify is supported + try: + return slugify_lib.slugify(s, max_length=max_length) + except TypeError: + pass spaceless = re.sub(r'\s+', '-', s) specialless = re.sub(r'[^-_A-Za-z0-9]', '', spaceless) return specialless[:max_length] @@ -215,7 +212,6 @@ class website(osv.osv): request.redirect = lambda url: werkzeug.utils.redirect(url_for(url)) request.context.update( - is_master_lang=is_master_lang, editable=is_website_publisher, translatable=not is_master_lang, ) @@ -228,37 +224,8 @@ class website(osv.osv): return self.pool["ir.ui.view"].browse(cr, uid, view_id, context=context) def _render(self, cr, uid, ids, template, values=None, context=None): - user = self.pool.get("res.users") - if not context: - context = {} - - # Take a context - qweb_values = context.copy() - # add some values - if values: - qweb_values.update(values) - # fill some defaults - qweb_values.update( - request=request, - json=simplejson, - website=request.website, - url_for=url_for, - keep_query=keep_query, - slug=slug, - res_company=request.website.company_id, - user_id=user.browse(cr, uid, uid), - quote_plus=werkzeug.url_quote_plus, - ) - qweb_values.setdefault('editable', False) - - # in edit mode ir.ui.view will tag nodes - context['inherit_branding'] = qweb_values['editable'] - - view = self.get_template(cr, uid, ids, template) - - if 'main_object' not in qweb_values: - qweb_values['main_object'] = view - return view.render(qweb_values, engine='website.qweb', context=context) + # TODO: remove this. (just kept for backward api compatibility for saas-3) + return self.pool['ir.ui.view'].render(cr, uid, template, values=values, context=context) def render(self, cr, uid, ids, template, values=None, status_code=None, context=None): def callback(template, values, context): @@ -517,7 +484,7 @@ class website_menu(osv.osv): _description = "Website Menu" _columns = { 'name': fields.char('Menu', size=64, required=True, translate=True), - 'url': fields.char('Url', required=True, translate=True), + 'url': fields.char('Url', translate=True), 'new_window': fields.boolean('New Window'), 'sequence': fields.integer('Sequence'), # TODO: support multiwebsite once done for ir.ui.views |
