[IMP] website: backport 5112421a (unslug)
authorJeremy Kersten <jke@odoo.com>
Mon, 30 Jun 2014 16:29:20 +0000 (18:29 +0200)
committerJeremy Kersten <jke@odoo.com>
Mon, 30 Jun 2014 16:29:20 +0000 (18:29 +0200)
Update the regexp to be not case sensitive

addons/website/models/ir_http.py
addons/website/models/website.py
addons/website/tests/test_converter.py
addons/website_crm_partner_assign/controllers/main.py
addons/website_customer/controllers/main.py
addons/website_membership/controllers/main.py

index 3550d2c..fc6de7e 100644 (file)
@@ -10,7 +10,7 @@ import werkzeug.routing
 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
 
@@ -194,7 +194,7 @@ class ModelConverter(ir.ir_http.ModelConverter):
     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)
@@ -203,7 +203,7 @@ class ModelConverter(ir.ir_http.ModelConverter):
         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]
index d6e47f5..261bbf3 100644 (file)
@@ -98,11 +98,23 @@ def slug(value):
     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)
 
index ca72a36..6a6b046 100644 (file)
@@ -9,10 +9,32 @@ from lxml.builder import E
 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(
index faae559..a880a83 100644 (file)
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 import logging
-import re
 import werkzeug
 
 _logger = logging.getLogger(__name__)
@@ -13,7 +12,7 @@ except ImportError:
 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 _
 
 
@@ -146,7 +145,7 @@ class WebsiteCrmPartnerAssign(http.Controller):
     # 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')
@@ -158,8 +157,7 @@ class WebsiteCrmPartnerAssign(http.Controller):
             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 = {
index 09db80c..810faf8 100644 (file)
@@ -1,9 +1,8 @@
 # -*- 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
@@ -84,9 +83,8 @@ class WebsiteCustomer(http.Controller):
     # 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 = {}
index 24e0ed2..1ab0e5e 100644 (file)
@@ -1,9 +1,8 @@
 # -*- 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
@@ -105,9 +104,8 @@ class WebsiteMembership(http.Controller):
     # 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 = {}