mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 00:52:03 +01:00 
			
		
		
		
	API
This commit is contained in:
		
							
								
								
									
										93
									
								
								tfjm/middlewares.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								tfjm/middlewares.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
from django.contrib.auth.models import AnonymousUser, User
 | 
			
		||||
 | 
			
		||||
from threading import local
 | 
			
		||||
 | 
			
		||||
from django.contrib.sessions.backends.db import SessionStore
 | 
			
		||||
 | 
			
		||||
USER_ATTR_NAME = getattr(settings, 'LOCAL_USER_ATTR_NAME', '_current_user')
 | 
			
		||||
SESSION_ATTR_NAME = getattr(settings, 'LOCAL_SESSION_ATTR_NAME', '_current_session')
 | 
			
		||||
IP_ATTR_NAME = getattr(settings, 'LOCAL_IP_ATTR_NAME', '_current_ip')
 | 
			
		||||
 | 
			
		||||
_thread_locals = local()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _set_current_user_and_ip(user=None, session=None, ip=None):
 | 
			
		||||
    setattr(_thread_locals, USER_ATTR_NAME, user)
 | 
			
		||||
    setattr(_thread_locals, SESSION_ATTR_NAME, session)
 | 
			
		||||
    setattr(_thread_locals, IP_ATTR_NAME, ip)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_current_user() -> User:
 | 
			
		||||
    return getattr(_thread_locals, USER_ATTR_NAME, None)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_current_session() -> SessionStore:
 | 
			
		||||
    return getattr(_thread_locals, SESSION_ATTR_NAME, None)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_current_ip() -> str:
 | 
			
		||||
    return getattr(_thread_locals, IP_ATTR_NAME, None)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_current_authenticated_user():
 | 
			
		||||
    current_user = get_current_user()
 | 
			
		||||
    if isinstance(current_user, AnonymousUser):
 | 
			
		||||
        return None
 | 
			
		||||
    return current_user
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SessionMiddleware(object):
 | 
			
		||||
    """
 | 
			
		||||
    This middleware get the current user with his or her IP address on each request.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, get_response):
 | 
			
		||||
        self.get_response = get_response
 | 
			
		||||
 | 
			
		||||
    def __call__(self, request):
 | 
			
		||||
        user = request.user
 | 
			
		||||
        if 'HTTP_X_FORWARDED_FOR' in request.META:
 | 
			
		||||
            ip = request.META.get('HTTP_X_FORWARDED_FOR')
 | 
			
		||||
        else:
 | 
			
		||||
            ip = request.META.get('REMOTE_ADDR')
 | 
			
		||||
 | 
			
		||||
        _set_current_user_and_ip(user, request.session, ip)
 | 
			
		||||
        response = self.get_response(request)
 | 
			
		||||
        _set_current_user_and_ip(None, None, None)
 | 
			
		||||
 | 
			
		||||
        return response
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TurbolinksMiddleware(object):
 | 
			
		||||
    """
 | 
			
		||||
    Send the `Turbolinks-Location` header in response to a visit that was redirected,
 | 
			
		||||
    and Turbolinks will replace the browser's topmost history entry.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, get_response):
 | 
			
		||||
        self.get_response = get_response
 | 
			
		||||
 | 
			
		||||
    def __call__(self, request):
 | 
			
		||||
        response = self.get_response(request)
 | 
			
		||||
 | 
			
		||||
        is_turbolinks = request.META.get('HTTP_TURBOLINKS_REFERRER')
 | 
			
		||||
        is_response_redirect = response.has_header('Location')
 | 
			
		||||
 | 
			
		||||
        if is_turbolinks:
 | 
			
		||||
            if is_response_redirect:
 | 
			
		||||
                location = response['Location']
 | 
			
		||||
                prev_location = request.session.pop('_turbolinks_redirect_to', None)
 | 
			
		||||
                if prev_location is not None:
 | 
			
		||||
                    # relative subsequent redirect
 | 
			
		||||
                    if location.startswith('.'):
 | 
			
		||||
                        location = prev_location.split('?')[0] + location
 | 
			
		||||
                request.session['_turbolinks_redirect_to'] = location
 | 
			
		||||
            else:
 | 
			
		||||
                if request.session.get('_turbolinks_redirect_to'):
 | 
			
		||||
                    location = request.session.pop('_turbolinks_redirect_to')
 | 
			
		||||
                    response['Turbolinks-Location'] = location
 | 
			
		||||
        return response
 | 
			
		||||
@@ -65,6 +65,7 @@ MIDDLEWARE = [
 | 
			
		||||
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
 | 
			
		||||
    'django.middleware.locale.LocaleMiddleware',
 | 
			
		||||
    'django.contrib.sites.middleware.CurrentSiteMiddleware',
 | 
			
		||||
    'tfjm.middlewares.TurbolinksMiddleware',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
ROOT_URLCONF = 'tfjm.urls'
 | 
			
		||||
@@ -127,6 +128,17 @@ PASSWORD_HASHERS = [
 | 
			
		||||
    'django.contrib.auth.hashers.BCryptPasswordHasher',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
REST_FRAMEWORK = {
 | 
			
		||||
    'DEFAULT_PERMISSION_CLASSES': [
 | 
			
		||||
        'rest_framework.permissions.IsAdminUser'
 | 
			
		||||
    ],
 | 
			
		||||
    'DEFAULT_AUTHENTICATION_CLASSES': [
 | 
			
		||||
        'rest_framework.authentication.SessionAuthentication',
 | 
			
		||||
        'rest_framework.authentication.TokenAuthentication',
 | 
			
		||||
    ],
 | 
			
		||||
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
 | 
			
		||||
    'PAGE_SIZE': 50,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Internationalization
 | 
			
		||||
# https://docs.djangoproject.com/en/3.0/topics/i18n/
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,8 @@ from django.contrib import admin
 | 
			
		||||
from django.urls import path, include
 | 
			
		||||
from django.views.generic import TemplateView
 | 
			
		||||
 | 
			
		||||
from member.views import DocumentView
 | 
			
		||||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    path('', TemplateView.as_view(template_name="index.html"), name="index"),
 | 
			
		||||
    path('i18n/', include('django.conf.urls.i18n')),
 | 
			
		||||
@@ -28,7 +30,11 @@ urlpatterns = [
 | 
			
		||||
 | 
			
		||||
    path('member/', include('member.urls')),
 | 
			
		||||
    path('tournament/', include('tournament.urls')),
 | 
			
		||||
 | 
			
		||||
    path("media/<str:file>/", DocumentView.as_view(), name="document"),
 | 
			
		||||
 | 
			
		||||
    path('api/', include('api.urls')),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 | 
			
		||||
# urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 | 
			
		||||
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user