add a middleware to get current partner from requests

This commit is contained in:
Benjamin Dauvergne 2017-06-22 11:59:27 +02:00
parent ec7bee3971
commit 70832a3617
2 changed files with 65 additions and 0 deletions

View File

@ -80,3 +80,6 @@ class Plugin(object):
def get_auth_frontends(self):
return []
def get_after_middleware(self):
return ['authentic2_cut.middlewares.CUTMiddleware']

View File

@ -0,0 +1,62 @@
from django.conf import settings
import urlparse
class CUTMiddleware(object):
'''Extract requesting domain from URL and set value on request and in session.
Domains extracted from ?next=<url> of ?redirect_uri=<url> parameters are matched against the
domains list of domain patterns.
Configuration:
A2_CUT_PARTNERS = [
{
'domains': ['.lyon.fr'],
'logo_url': 'https://www.lyon.fr/static/logo_cut.png',
'color': '#452334',
'name': u'Ville de Lyon',
}
}
Use in templates:
{% if request.partner %}{{ request.partner.name }}{% endif %}
'''
MATCHES = {}
def process_request(self, request):
domain = None
if 'next' in request.GET or 'redirect_uri' in request.GET:
url = request.GET.get('next') or request.GET.get('redirect_uri')
netloc = urlparse.urlparse(url).netloc
if netloc:
domain = netloc.split(':')[-1]
if domain:
if domain not in self.MATCHES:
for partner_def in getattr(settings, 'A2_CUT_PARTNERS', []):
patterns = partner_def.get('domains', [])
for pattern in patterns:
if pattern.startswith('.'):
if domain.endswith(pattern) or domain == pattern[1:]:
break
elif pattern == domain:
break
else:
continue
self.MATCHES[domain] = partner_def
request.session['cut_domain'] = domain
break
else:
# when adding a domain, you must reload, must thing of emptying the cache
# sometimes
self.MATCHES[domain] = None
request.session['cut_domain'] = None
else:
domain = request.session.get('cut_domain')
if domain and domain in self.MATCHES:
request.partner = self.MATCHES[domain]
else:
request.partner = None
return None