Skip to content

Commit 1616938

Browse files
author
Nicolas RAMY
committed
bootstrap plugins
1 parent ddd7ed0 commit 1616938

File tree

11 files changed

+195
-0
lines changed

11 files changed

+195
-0
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,4 @@ ENV/
8787

8888
# Rope project settings
8989
.ropeproject
90+
.idea

Diff for: MANIFEST.in

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
include *.txt
2+
include LICENSE

Diff for: README.rst

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# django-helpers

Diff for: django_helpers/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
__version__ = '0.0.0'
2+
3+
default_app_config = 'django_helpers.apps.DjangoHelpersConfig'

Diff for: django_helpers/api.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
def get_pagination(request):
2+
"""
3+
Return the pagination storage on the request if it exists, otherwise return an empty dict.
4+
5+
:param request:
6+
:return:
7+
"""
8+
return getattr(request, '_pagination', {})

Diff for: django_helpers/apps.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class DjangoHelpersConfig(AppConfig):
5+
name = 'django_helpers'

Diff for: django_helpers/constants.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
RANGE_OFFSET = 7

Diff for: django_helpers/context_processors.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from django_helpers.api import get_pagination
2+
3+
4+
def pagination(request):
5+
"""
6+
Return a lazy 'pagination' context variable
7+
8+
:param request:
9+
:return: dict
10+
"""
11+
12+
return {
13+
'pagination': get_pagination(request)
14+
}

Diff for: django_helpers/middleware.py

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from django.conf import settings
2+
from django.utils.deprecation import MiddleWareMixin
3+
4+
from . import constants
5+
6+
7+
class PaginationMiddleware(MiddlewareMixin):
8+
"""
9+
Middleware that handles pagination parameters
10+
"""
11+
12+
def process_request(self, request):
13+
pagination = {
14+
'filters': {},
15+
'sort': None,
16+
'direction': None,
17+
'search': None,
18+
'page': 1
19+
}
20+
21+
if request.POST and 'search' in request.POST:
22+
pagination['search'] = request.POST.get('search')
23+
elif 'search' in request.GET:
24+
pagination['search'] = request.GET.get('search')
25+
26+
if 'page' in request.GET:
27+
try:
28+
pagination['page'] = int(request.GET.get('page'))
29+
except ValueError:
30+
pass
31+
32+
if 'filters' in request.GET:
33+
for word in request.GET.get('filters').split(','):
34+
filter_key, filter_value = word.split(':')
35+
pagination['filters'][filter_key] = filter_value
36+
37+
if 'direction' in request.GET and 'sort' in request.GET:
38+
pagination['direction'] = request.GET.get('direction')
39+
pagination['sort'] = request.GET.get('sort')
40+
41+
request._pagination = pagination
42+
43+
def process_response(self, request, response):
44+
if hasattr(request, '_paginator') and hasattr(request, '_results'):
45+
pagination = request._pagination
46+
paginator = request._paginator
47+
results = request._results
48+
49+
if hasattr(settings, 'PAGINATOR_RANGE_OFFSET'):
50+
range_offset = settings.PAGINATOR_RANGE_OFFSET
51+
else:
52+
range_offset = constants.PAGINATOR_RANGE_OFFSET
53+
54+
range_start = pagination['page'] - range_offset
55+
range_start = range_start if range_start >= 1 else 1
56+
57+
range_end = pagination['page'] + range_offset
58+
range_end = range_end if range_end <= paginator.num_pages else paginator.num_pages
59+
60+
pagination['pages'] = {
61+
'current': pagination['page'],
62+
'last': paginator.num_pages,
63+
'first': 1,
64+
'range_start': range_start if range_start >= 1 else 1,
65+
'range_end': range_end if range_end <= paginator.num_pages else paginator.num_pages,
66+
'range': range(range_start, range_end + 1),
67+
'has_next': results.has_next,
68+
'has_previous': results.has_previous,
69+
'previous_page_number': results.previous_page_number,
70+
'next_page_number': results.next_page_number
71+
}
72+
73+
request._pagination = pagination
74+
del request._paginator
75+
del request._results
76+
77+
return response

Diff for: django_helpers/templatetags/pagination.py

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from django import template
2+
from django.utils.http import urlquote
3+
4+
register = template.Library()
5+
6+
7+
@register.filter
8+
def pagination_nav_url(data, page):
9+
if page == data['pages']['current']:
10+
return '#'
11+
else:
12+
url = '?page=%d' % page
13+
14+
if data['filters']:
15+
serialized_filters = list()
16+
for filter_key in data['filters']:
17+
serialized_filters.append('%s:%s' % (filter_key, data['filters'][filter_key]))
18+
19+
if len(serialized_filters):
20+
url += '&filters=%s' % '+'.join(serialized_filters)
21+
22+
if data['direction']:
23+
url += '&direction=%s' % data['direction']
24+
25+
if data['sort']:
26+
url += '&sort=%s' % data['sort']
27+
28+
if data['search']:
29+
url += '&search=%s' % urlquote(data['search'])
30+
31+
return url
32+
33+
34+
@register.filter
35+
def pagination_filter_url(data, filters):
36+
37+
current_filter_key, current_filter_value = filters.split(':')
38+
39+
url = '?filters=%s' % filters
40+
41+
if data['filters']:
42+
for filter_key in data['filters']:
43+
if filter_key == current_filter_key:
44+
continue
45+
url += ',%s:%s' % (filter_key, data['filters'][filter_key])
46+
47+
if data['direction']:
48+
url += '&direction=%s' % data['direction']
49+
50+
if data['sort']:
51+
url += '&sort=%s' % data['sort']
52+
53+
if data['search']:
54+
url += '&search=%s' % urlquote(data['search'])
55+
56+
return url

Diff for: setup.py

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from setuptools import setup, find_packages
5+
6+
import django_helpers
7+
8+
setup(
9+
name='django-helpers',
10+
version=django_helpers.__version__,
11+
packages=find_packages(),
12+
author='Nicolas RAMY',
13+
author_email='[email protected]',
14+
license='MIT',
15+
description='A set of context_processors, decorators, middlewares and others stuffs to develop quickly with Django',
16+
long_description=open('README.rst').read(),
17+
include_package_data=True,
18+
zip_safe=False,
19+
install_requires=['Django', ],
20+
url='https://github.com/nicolasramy/django-helpers',
21+
classifiers=[
22+
'Development Status :: 4 - Alpha',
23+
'License :: OSI Approved :: MIT License',
24+
'Operating System :: OS Independent',
25+
'Programming Language :: Python :: 2.7'
26+
],
27+
)

0 commit comments

Comments
 (0)