31 lines
		
	
	
		
			942 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			942 B
		
	
	
	
		
			Python
		
	
	
	
	
	
| """URL-related utils"""
 | |
| from urllib.parse import urlparse
 | |
| 
 | |
| from django.http import HttpResponse
 | |
| from django.shortcuts import redirect, reverse
 | |
| from django.urls import NoReverseMatch
 | |
| from django.utils.http import urlencode
 | |
| from structlog import get_logger
 | |
| 
 | |
| LOGGER = get_logger()
 | |
| 
 | |
| 
 | |
| def is_url_absolute(url):
 | |
|     """Check if domain is absolute to prevent user from being redirect somewhere else"""
 | |
|     return bool(urlparse(url).netloc)
 | |
| 
 | |
| 
 | |
| def redirect_with_qs(view: str, get_query_set=None, **kwargs) -> HttpResponse:
 | |
|     """Wrapper to redirect whilst keeping GET Parameters"""
 | |
|     try:
 | |
|         target = reverse(view, kwargs=kwargs)
 | |
|     except NoReverseMatch:
 | |
|         if not is_url_absolute(view):
 | |
|             return redirect(view)
 | |
|         LOGGER.debug("redirect target is not a valid view", view=view)
 | |
|         raise
 | |
|     else:
 | |
|         if get_query_set:
 | |
|             target += "?" + urlencode(get_query_set.items())
 | |
|         return redirect(target)
 | 
