import openerp
from openerp.addons.base import ir
from openerp.addons.base.ir import ir_qweb
-from openerp.addons.website.models.website import slug
+from openerp.addons.website.models.website import slug, _UNSLUG_RE
from openerp.http import request
from openerp.osv import orm
def __init__(self, url_map, model=False, domain='[]'):
super(ModelConverter, self).__init__(url_map, model)
self.domain = domain
- self.regex = r'(?:[A-Za-z0-9-_]+?-)?(\d+)(?=$|/)'
+ self.regex = _UNSLUG_RE.pattern
def to_url(self, value):
return slug(value)
m = re.match(self.regex, value)
_uid = RequestUID(value=value, match=m, converter=self)
return request.registry[self.model].browse(
- request.cr, _uid, int(m.group(1)), context=request.context)
+ request.cr, _uid, int(m.group(2)), context=request.context)
def generate(self, cr, uid, query=None, args=None, context=None):
obj = request.registry[self.model]
else:
# assume name_search result tuple
id, name = value
- slugname = slugify(name or '')
+ slugname = slugify(name or '').strip().strip('-')
if not slugname:
return str(id)
return "%s-%d" % (slugname, id)
+
+_UNSLUG_RE = re.compile(r'(?:(\w{1,2}|\w[a-zA-Z0-9-_]+?\w)-)?(-?\d+)(?=$|/)')
+
+def unslug(s):
+ """Extract slug and id from a string.
+ Always return un 2-tuple (str|None, int|None)
+ """
+ m = _UNSLUG_RE.match(s)
+ if not m:
+ return None, None
+ return m.group(1), int(m.group(2))
+
def urlplus(url, params):
return werkzeug.Href(url)(params or None)
from openerp.tests import common
from openerp.addons.base.ir import ir_qweb
from openerp.addons.website.models.ir_qweb import html_to_text
+from openerp.addons.website.models.website import unslug
impl = getDOMImplementation()
document = impl.createDocument(None, None, None)
+class TestUnslug(unittest2.TestCase):
+ def test_unslug(self):
+ tests = {
+ '': (None, None),
+ 'foo': (None, None),
+ 'foo-': (None, None),
+ '-': (None, None),
+ 'foo-1': ('foo', 1),
+ 'foo-bar-1': ('foo-bar', 1),
+ 'foo--1': ('foo', -1),
+ '1': (None, 1),
+ '1-1': ('1', 1),
+ '--1': (None, None),
+ 'foo---1': (None, None),
+ 'foo1': (None, None),
+ }
+
+ for slug, expected in tests.iteritems():
+ self.assertEqual(unslug(slug), expected)
+
+
class TestHTMLToText(unittest2.TestCase):
def test_rawstring(self):
self.assertEqual(
# -*- coding: utf-8 -*-
import logging
-import re
import werkzeug
_logger = logging.getLogger(__name__)
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
-from openerp.addons.website.models.website import slug
+from openerp.addons.website.models.website import slug, unslug
from openerp.tools.translate import _
# Do not use semantic controller due to SUPERUSER_ID
@http.route(['/partners/<partner_id>'], type='http', auth="public", website=True, multilang=True)
def partners_detail(self, partner_id, partner_name='', **post):
- mo = re.search('-([-0-9]+)$', str(partner_id))
+ _, partner_id = unslug(partner_id)
current_grade, current_country = None, None
grade_id = post.get('grade_id')
country_id = post.get('country_id')
country_ids = request.registry['res.country'].exists(request.cr, request.uid, int(country_id), context=request.context)
if country_ids:
current_country = request.registry['res.country'].browse(request.cr, request.uid, country_ids[0], context=request.context)
- if mo:
- partner_id = int(mo.group(1))
+ if partner_id:
partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
if partner.exists() and partner.website_published:
values = {
# -*- coding: utf-8 -*-
-import re
-
import openerp
from openerp import SUPERUSER_ID
from openerp.addons.web import http
+from openerp.addons.website.models.website import unslug
from openerp.tools.translate import _
from openerp.addons.web.http import request
import werkzeug.urls
# Do not use semantic controller due to SUPERUSER_ID
@http.route(['/customers/<partner_id>'], type='http', auth="public", website=True, multilang=True)
def partners_detail(self, partner_id, **post):
- mo = re.search('-([-0-9]+)$', str(partner_id))
- if mo:
- partner_id = int(mo.group(1))
+ _, partner_id = unslug(partner_id)
+ if partner_id:
partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
if partner.exists() and partner.website_published:
values = {}
# -*- coding: utf-8 -*-
-import re
-
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
+from openerp.addons.website.models.website import unslug
from openerp.tools.translate import _
import werkzeug.urls
# Do not use semantic controller due to SUPERUSER_ID
@http.route(['/members/<partner_id>'], type='http', auth="public", website=True, multilang=True)
def partners_detail(self, partner_id, **post):
- mo = re.search('-([-0-9]+)$', str(partner_id))
- if mo:
- partner_id = int(mo.group(1))
+ _, partner_id = unslug(partner_id)
+ if partner_id:
partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
if partner.exists() and partner.website_published:
values = {}