Skip to content

Commit 27bda8f

Browse files
authored
Merge pull request #3 from easy-as-python/django-compatibility-update
Updates for Django 1.10+ and Django 2.0+ compatibility
2 parents c74d1ed + 55f8d90 commit 27bda8f

13 files changed

+81
-10
lines changed

.travis.yml

+10
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,15 @@ language: python
22
python:
33
- "3.4"
44
- "3.5"
5+
- "3.6"
6+
env:
7+
- DJANGO_VERSION=1.8.18
8+
- DJANGO_VERSION=1.9.13
9+
- DJANGO_VERSION=1.10.8
10+
- DJANGO_VERSION=1.11.9
11+
- DJANGO_VERSION=2.0.1
12+
install:
13+
- pip install -r requirements.txt
14+
- pip install Django==$DJANGO_VERSION
515
script:
616
- python runtests.py

README.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
* Add `webmention` to `INSTALLED_APPS`
1010
* Run `manage.py migrate webmention`
1111
* Add `url(r'^webmention', include('webmention.urls', namespace='webmention'))` to top-level `urls.py`
12+
* Use `path('webmention/', include(webmention.urls))` for newer projects
1213
* Run `manage.py test webmention` to ensure unit tests all pass
1314

1415
## Usage
1516

1617
* Include webmention information by either:
17-
* Adding `webmention.middleware.WebMentionMiddleware` to `MIDDLEWARE_CLASSES` (affects all views)
18+
* Installing the middleware in `settings.py` (affects all views)
19+
* Use `webmention.middleware.webmention_middleware` in `MIDDLEWARE` for new projects and projects with Django >= 1.10
20+
* Use `webmention.middleware.WebMentionMiddleware` in `MIDDLEWARE_CLASSES` for older projects
1821
* Decorating a specific view with `webmention.middleware.include_webmention_information`
1922
* View webmention responses in the Django admin tool and mark them as reviewed as needed

setup.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,30 @@
1111

1212
setup(
1313
name='django-webmention',
14-
version='0.0.4',
14+
version='0.1.0',
1515
packages=find_packages(),
1616
description='A pluggable implementation of webmention for Django projects.',
1717
keywords='webmention pingback linkback blogging',
1818
author='Dane Hillard',
1919
author_email='[email protected]',
2020
long_description=readme,
2121
install_requires=requirements,
22-
url='https://github.com/daneah/django-webmention',
22+
url='https://github.com/easy-as-python/django-webmention',
2323
license='MIT',
2424
classifiers=[
2525
'Development Status :: 2 - Pre-Alpha',
2626
'Intended Audience :: Developers',
2727
'Framework :: Django',
2828
'Framework :: Django :: 1.8',
2929
'Framework :: Django :: 1.9',
30+
'Framework :: Django :: 1.10',
31+
'Framework :: Django :: 1.11',
32+
'Framework :: Django :: 2.0',
3033
'Topic :: Internet :: WWW/HTTP :: Indexing/Search',
3134
'License :: OSI Approved :: MIT License',
3235
'Programming Language :: Python :: 3',
3336
'Programming Language :: Python :: 3.4',
3437
'Programming Language :: Python :: 3.5',
38+
'Programming Language :: Python :: 3.6',
3539
],
3640
)

webmention/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import checks

webmention/checks.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import django
2+
from django.conf import settings
3+
from django.core.checks import Error, register, Tags
4+
5+
6+
@register(Tags.compatibility)
7+
def new_style_middleware_check(app_configs, **kwargs):
8+
errors = []
9+
10+
if django.VERSION[1] >= 10 or django.VERSION[0] > 1:
11+
installed_middlewares = getattr(settings, 'MIDDLEWARE', []) or []
12+
if 'webmention.middleware.WebMentionMiddleware' in installed_middlewares:
13+
errors.append(
14+
Error(
15+
'You are attempting to use an old-style middleware class in the MIDDLEWARE setting',
16+
hint='Either use MIDDLEWARE_CLASSES or use webmention.middleware.webmention_middleware instead',
17+
id='webmention.E001',
18+
)
19+
)
20+
return errors

webmention/middleware.py

+20-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
from django.core.urlresolvers import reverse
21
from django.utils.decorators import decorator_from_middleware
32

3+
try:
4+
from django.core.urlresolvers import reverse
5+
except ImportError:
6+
from django.urls import reverse
47

5-
class WebMentionMiddleware(object):
6-
def process_response(self, request, response):
8+
9+
def add_webmention_headers_to_response(request, response):
710
link_header = '<{scheme}://{host}{path}>; rel="webmention"'.format(
811
scheme=request.scheme,
912
host=request.META.get('HTTP_HOST'),
@@ -16,4 +19,18 @@ def process_response(self, request, response):
1619

1720
return response
1821

22+
23+
class WebMentionMiddleware(object):
24+
def process_response(self, request, response):
25+
return add_webmention_headers_to_response(request, response)
26+
27+
28+
def webmention_middleware(get_response):
29+
def middleware(request):
30+
response = get_response(request)
31+
return add_webmention_headers_to_response(request, response)
32+
33+
return middleware
34+
35+
1936
include_webmention_information = decorator_from_middleware(WebMentionMiddleware)

webmention/resolution.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import requests
22

33
from urllib.parse import urlparse
4-
from django.core.urlresolvers import resolve, Resolver404
4+
5+
try:
6+
from django.core.urlresolvers import resolve, Resolver404
7+
except ImportError:
8+
from django.urls import resolve, Resolver404
59

610

711
def url_resolves(url):

webmention/templatetags/__init__.py

Whitespace-only changes.

webmention/templatetags/webmention.py

Whitespace-only changes.

webmention/tests/test_middleware.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
from unittest.mock import Mock
2-
from django.core.urlresolvers import reverse
2+
3+
try:
4+
from django.core.urlresolvers import reverse
5+
except ImportError:
6+
from django.urls import reverse
37

48
from django.http import HttpResponse
59
from django.test import TestCase, Client

webmention/tests/test_resolution.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
from unittest.mock import Mock, patch
2-
from django.core.urlresolvers import Resolver404
2+
3+
try:
4+
from django.core.urlresolvers import Resolver404
5+
except ImportError:
6+
from django.urls import Resolver404
37

48
from django.test import TestCase
59

webmention/urls.py

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
from . import views
44

5+
6+
app_name = 'webmention'
7+
8+
59
urlpatterns = [
610
url(r'^receive$', views.receive, name='receive'),
711
]

webmention/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def receive(request):
2525

2626
response_body = fetch_and_validate_source(source, target)
2727
webmention.update(source, target, response_body)
28-
return HttpResponse(status_code=202, reason_phrase='The webmention was successfully received')
28+
return HttpResponse('The webmention was successfully received', status=202)
2929
except (SourceFetchError, TargetNotFoundError) as e:
3030
webmention.invalidate()
3131
return HttpResponseBadRequest(str(e))

0 commit comments

Comments
 (0)