summaryrefslogtreecommitdiff
path: root/addons/website/models
diff options
context:
space:
mode:
Diffstat (limited to 'addons/website/models')
-rw-r--r--addons/website/models/__init__.py1
-rw-r--r--addons/website/models/ir_actions.py35
-rw-r--r--addons/website/models/ir_http.py2
-rw-r--r--addons/website/models/ir_ui_view.py41
-rw-r--r--addons/website/models/res_config.py8
-rw-r--r--addons/website/models/website.py65
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