Rafał Pitoń 8 лет назад
Родитель
Сommit
8b4d1795f7

+ 6 - 6
misago/markup/tests/test_parser.py

@@ -217,11 +217,11 @@ Lorem ipsum: http://somewhere.com/somewhere-something/
     def test_clean_linked_image(self):
         """parser handles image element nested in link"""
         test_text = """
-[![3.png](http://test.com/a/thumb/test-43/)](http://test.com/a/test-43/)
+[![3.png](http://test.com/a/thumb/test/43/)](http://test.com/a/test/43/)
         """.strip()
 
         expected_result = """
-<p><a href="/a/test-43/" rel="nofollow"><img alt="3.png" src="/a/thumb/test-43/"/></a></p>
+<p><a href="/a/test/43/" rel="nofollow"><img alt="3.png" src="/a/thumb/test/43/"/></a></p>
 """.strip()
 
         result = parse(test_text, MockRequest(), MockPoster(), minify=True)
@@ -230,11 +230,11 @@ Lorem ipsum: http://somewhere.com/somewhere-something/
     def test_force_shva(self):
         """parser appends ?shva=1 bit to attachment links if flag is present"""
         test_text = """
-![3.png](http://test.com/a/thumb/test-43/)
+![3.png](http://test.com/a/thumb/test/43/)
         """.strip()
 
         expected_result = """
-<p><img alt="3.png" src="/a/thumb/test-43/?shva=1"/></p>
+<p><img alt="3.png" src="/a/thumb/test/43/?shva=1"/></p>
 """.strip()
 
         result = parse(test_text, MockRequest(), MockPoster(), minify=True, force_shva=True)
@@ -243,11 +243,11 @@ Lorem ipsum: http://somewhere.com/somewhere-something/
     def test_remove_shva(self):
         """parser removes ?shva=1 bit from attachment links if flag is absent"""
         test_text = """
-![3.png](http://test.com/a/thumb/test-43/?shva=1)
+![3.png](http://test.com/a/thumb/test/43/?shva=1)
         """.strip()
 
         expected_result = """
-<p><img alt="3.png" src="/a/thumb/test-43/"/></p>
+<p><img alt="3.png" src="/a/thumb/test/43/"/></p>
 """.strip()
 
         result = parse(test_text, MockRequest(), MockPoster(), minify=True)

+ 15 - 10
misago/threads/tests/test_utils.py

@@ -168,62 +168,62 @@ class GetThreadIdFromUrlTests(MisagoTestCase):
             {
                 # perfect match
                 'request': MockRequest('https', 'testforum.com', '/discuss/'),
-                'url': 'https://testforum.com/discuss/t/test-thread-123/',
+                'url': 'https://testforum.com/discuss/t/test-thread/123/',
                 'pk': 123
             },
             {
                 # we don't validate scheme in case site recently moved to https
                 # but user still has old url's saved somewhere
                 'request': MockRequest('http', 'testforum.com', '/discuss/'),
-                'url': 'http://testforum.com/discuss/t/test-thread-432/post/12321/',
+                'url': 'http://testforum.com/discuss/t/test-thread/432/post/12321/',
                 'pk': 432
             },
             {
                 # extract thread id from other thread urls
                 'request': MockRequest('https', 'testforum.com', '/discuss/'),
-                'url': 'http://testforum.com/discuss/t/test-thread-432/post/12321/',
+                'url': 'http://testforum.com/discuss/t/test-thread/432/post/12321/',
                 'pk': 432
             },
             {
                 # extract thread id from thread page url
                 'request': MockRequest('http', 'testforum.com', '/discuss/'),
-                'url': 'http://testforum.com/discuss/t/test-thread-432/123/',
+                'url': 'http://testforum.com/discuss/t/test-thread/432/123/',
                 'pk': 432
             },
             {
                 # extract thread id from thread last post url with relative schema
                 'request': MockRequest('http', 'testforum.com', '/discuss/'),
-                'url': '//testforum.com/discuss/t/test-thread-18/last/',
+                'url': '//testforum.com/discuss/t/test-thread/18/last/',
                 'pk': 18
             },
             {
                 # extract thread id from url that lacks scheme
                 'request': MockRequest('http', 'testforum.com', ''),
-                'url': 'testforum.com/t/test-thread-12/last/',
+                'url': 'testforum.com/t/test-thread/12/last/',
                 'pk': 12
             },
             {
                 # extract thread id from schemaless thread last post url
                 'request': MockRequest('http', 'testforum.com', '/discuss/'),
-                'url': 'testforum.com/discuss/t/test-thread-18/last/',
+                'url': 'testforum.com/discuss/t/test-thread/18/last/',
                 'pk': 18
             },
             {
                 # extract thread id from url that lacks scheme and hostname
                 'request': MockRequest('http', 'testforum.com', ''),
-                'url': '/t/test-thread-13/',
+                'url': '/t/test-thread/13/',
                 'pk': 13
             },
             {
                 # extract thread id from url that has port name
                 'request': MockRequest('http', '127.0.0.1:8000', ''),
-                'url': 'https://127.0.0.1:8000/t/test-thread-13/',
+                'url': 'https://127.0.0.1:8000/t/test-thread/13/',
                 'pk': 13
             },
             {
                 # extract thread id from url that isn't trimmed
                 'request': MockRequest('http', '127.0.0.1:8000', ''),
-                'url': '   /t/test-thread-13/   ',
+                'url': '   /t/test-thread/13/   ',
                 'pk': 13
             }
         )
@@ -251,6 +251,11 @@ class GetThreadIdFromUrlTests(MisagoTestCase):
                 'url': 'https://testforum.com/thread/bobboberson-123/'
             },
             {
+                # dashed thread url
+                'request': MockRequest('http', 'testforum.com'),
+                'url': 'https://testforum.com/t/bobboberson-123/'
+            },
+            {
                 # non-thread url
                 'request': MockRequest('http', 'testforum.com'),
                 'url': 'https://testforum.com/user/bobboberson-123/'

+ 12 - 12
misago/threads/urls/__init__.py

@@ -57,12 +57,12 @@ else:
 
 
 urlpatterns += threads_list_patterns('category', CategoryThreads, (
-    r'^c/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/$',
-    r'^c/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/my/$',
-    r'^c/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/new/$',
-    r'^c/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/unread/$',
-    r'^c/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/subscribed/$',
-    r'^c/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/unapproved/$',
+    r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/$',
+    r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/my/$',
+    r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/new/$',
+    r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/unread/$',
+    r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/subscribed/$',
+    r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/unapproved/$',
 ))
 
 
@@ -77,8 +77,8 @@ urlpatterns += threads_list_patterns('private-threads', PrivateThreads, (
 
 def thread_view_patterns(prefix, view):
     urls = [
-        url(r'^%s/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/$' % prefix[0], view.as_view(), name=prefix),
-        url(r'^%s/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/(?P<page>\d+)/$' % prefix[0], view.as_view(), name=prefix),
+        url(r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/$' % prefix[0], view.as_view(), name=prefix),
+        url(r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/(?P<page>\d+)/$' % prefix[0], view.as_view(), name=prefix),
     ]
     return urls
 
@@ -92,12 +92,12 @@ def goto_patterns(prefix, **views):
 
     post_view = views.pop('post', None)
     if post_view:
-        url_pattern = r'^%s/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/post/(?P<post>\d+)/$' % prefix[0]
+        url_pattern = r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/post/(?P<post>\d+)/$' % prefix[0]
         url_name = '%s-post' % prefix
         urls.append(url(url_pattern, post_view.as_view(), name=url_name))
 
     for name, view in views.items():
-        url_pattern = r'^%s/(?P<slug>[-a-zA-Z0-9]+)-(?P<pk>\d+)/%s/$' % (prefix[0], name)
+        url_pattern = r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/%s/$' % (prefix[0], name)
         url_name = '%s-%s' % (prefix, name)
         urls.append(url(url_pattern, view.as_view(), name=url_name))
 
@@ -121,6 +121,6 @@ urlpatterns += goto_patterns(
 
 
 urlpatterns += [
-    url(r'^a/(?P<secret>[-a-zA-Z0-9]+)-(?P<pk>\d+)/', attachment_server, name='attachment'),
-    url(r'^a/thumb/(?P<secret>[-a-zA-Z0-9]+)-(?P<pk>\d+)/', attachment_server, name='attachment-thumbnail', kwargs={'thumbnail': True}),
+    url(r'^a/(?P<secret>[-a-zA-Z0-9]+)/(?P<pk>\d+)/', attachment_server, name='attachment'),
+    url(r'^a/thumb/(?P<secret>[-a-zA-Z0-9]+)/(?P<pk>\d+)/', attachment_server, name='attachment-thumbnail', kwargs={'thumbnail': True}),
 ]

+ 1 - 1
misago/users/urls/__init__.py

@@ -43,7 +43,7 @@ urlpatterns += [
 
 
 urlpatterns += [
-    url(r'^u/(?P<slug>[a-zA-Z0-9]+)-(?P<pk>\d+)/', include([
+    url(r'^u/(?P<slug>[a-zA-Z0-9]+)/(?P<pk>\d+)/', include([
         url(r'^$', profile.landing, name='user'),
         url(r'^posts/$', profile.posts, name='user-posts'),
         url(r'^threads/$', profile.threads, name='user-threads'),